Search
lxdream.org :: lxdream/src/gtkui/gtk_gd.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/gtkui/gtk_gd.c
changeset 1109:700c5ab26a63
prev1065:bc1cc0c54917
author nkeynes
date Thu Feb 23 15:24:47 2012 +1000 (12 years ago)
permissions -rw-r--r--
last change Check for existence of glDrawBuffer (assuming that glReadBuffer will
follow). Note only need to guard the common code in gl_fbo.c
file annotate diff log raw
nkeynes@464
     1
/**
nkeynes@561
     2
 * $Id$
nkeynes@464
     3
 *
nkeynes@464
     4
 * Creates and manages the GD-Rom attachment menu.
nkeynes@464
     5
 *
nkeynes@464
     6
 * Copyright (c) 2005 Nathan Keynes.
nkeynes@464
     7
 *
nkeynes@464
     8
 * This program is free software; you can redistribute it and/or modify
nkeynes@464
     9
 * it under the terms of the GNU General Public License as published by
nkeynes@464
    10
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@464
    11
 * (at your option) any later version.
nkeynes@464
    12
 *
nkeynes@464
    13
 * This program is distributed in the hope that it will be useful,
nkeynes@464
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@464
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@464
    16
 * GNU General Public License for more details.
nkeynes@464
    17
 */
nkeynes@464
    18
nkeynes@464
    19
#include <assert.h>
nkeynes@464
    20
#include <libgen.h>
nkeynes@464
    21
#include "dream.h"
nkeynes@464
    22
#include "dreamcast.h"
nkeynes@464
    23
#include "config.h"
nkeynes@761
    24
#include "gdlist.h"
nkeynes@464
    25
#include "gdrom/gdrom.h"
nkeynes@537
    26
#include "gtkui/gtkui.h"
nkeynes@464
    27
nkeynes@691
    28
static gboolean gdrom_menu_adjusting = FALSE;
nkeynes@464
    29
nkeynes@1109
    30
gboolean gtk_gui_gdrom_mount_image( const char *filename )
nkeynes@1109
    31
{
nkeynes@1109
    32
    ERROR err;
nkeynes@1109
    33
    gboolean ok = gdrom_mount_image( filename, &err );
nkeynes@1109
    34
    if( !ok ) {
nkeynes@1109
    35
        ERROR( err.msg );
nkeynes@1109
    36
    }
nkeynes@1109
    37
    return ok;
nkeynes@1109
    38
}
nkeynes@1109
    39
nkeynes@691
    40
static void gdrom_menu_open_image_callback( GtkWidget *widget, gpointer user_data )
nkeynes@464
    41
{
nkeynes@464
    42
    if( !gdrom_menu_adjusting ) {
nkeynes@1109
    43
        open_file_dialog_cb( _("Open..."), gtk_gui_gdrom_mount_image, NULL, NULL, CONFIG_DEFAULT_PATH );
nkeynes@678
    44
    }
nkeynes@678
    45
}
nkeynes@678
    46
nkeynes@691
    47
void gdrom_menu_item_callback( GtkWidget *widget, gpointer user_data )
nkeynes@678
    48
{
nkeynes@678
    49
    if( !gdrom_menu_adjusting ) {
nkeynes@1109
    50
        ERROR err;
nkeynes@1109
    51
        gboolean ok = gdrom_list_set_selection( GPOINTER_TO_INT(user_data), &err );
nkeynes@1109
    52
        if( !ok ) {
nkeynes@1109
    53
            ERROR( err.msg );
nkeynes@1109
    54
        }
nkeynes@464
    55
    }
nkeynes@464
    56
}
nkeynes@464
    57
nkeynes@464
    58
void gdrom_menu_build( GtkWidget *menu ) 
nkeynes@464
    59
{
nkeynes@691
    60
    unsigned int i, len;
nkeynes@464
    61
    GSList *group = NULL;
nkeynes@736
    62
nkeynes@691
    63
    len = gdrom_list_size();
nkeynes@691
    64
    for( i=0; i < len; i++ ) {
nkeynes@691
    65
        const gchar *entry = gdrom_list_get_display_name(i);
nkeynes@691
    66
        if( entry[0] == '\0' ) { // Empty string = separator
nkeynes@691
    67
            gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() );
nkeynes@691
    68
        } else {
nkeynes@691
    69
            GtkWidget *item = gtk_radio_menu_item_new_with_label( group, entry );
nkeynes@691
    70
            group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) );
nkeynes@691
    71
            g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_item_callback), GINT_TO_POINTER(i) );
nkeynes@691
    72
            gtk_menu_shell_append( GTK_MENU_SHELL(menu), item );
nkeynes@691
    73
        }
nkeynes@464
    74
    }
nkeynes@464
    75
nkeynes@464
    76
    gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() );
nkeynes@508
    77
    GtkWidget *open = gtk_image_menu_item_new_with_label( _("Open image file...") );
nkeynes@464
    78
    g_signal_connect_after( open, "activate", G_CALLBACK(gdrom_menu_open_image_callback), NULL );
nkeynes@464
    79
    gtk_menu_shell_append( GTK_MENU_SHELL(menu), open );
nkeynes@464
    80
    gtk_widget_show_all(menu);
nkeynes@464
    81
}
nkeynes@464
    82
nkeynes@691
    83
void gdrom_menu_rebuild( GtkWidget *menu )
nkeynes@691
    84
{
nkeynes@691
    85
    GList *children = gtk_container_get_children( GTK_CONTAINER(menu) );
nkeynes@691
    86
    GList *listptr;
nkeynes@691
    87
    for( listptr = children; listptr != NULL; listptr = g_list_next(listptr) ) {
nkeynes@691
    88
        gtk_widget_destroy( GTK_WIDGET(listptr->data) );
nkeynes@691
    89
    }
nkeynes@691
    90
    g_list_free(children);
nkeynes@691
    91
    gdrom_menu_build(menu);
nkeynes@691
    92
}
nkeynes@691
    93
nkeynes@691
    94
gboolean gdrom_menu_update( gboolean list_changed, int selection, void *user_data )
nkeynes@691
    95
{
nkeynes@691
    96
    gdrom_menu_adjusting = TRUE;
nkeynes@691
    97
    GtkWidget *menu = GTK_WIDGET(user_data);
nkeynes@691
    98
nkeynes@691
    99
    if( list_changed ) {
nkeynes@691
   100
        gdrom_menu_rebuild(menu);
nkeynes@691
   101
    }
nkeynes@691
   102
nkeynes@691
   103
    GList *children = gtk_container_get_children( GTK_CONTAINER(menu) );
nkeynes@691
   104
    GList *item = g_list_nth( children, selection );
nkeynes@691
   105
    assert( item != NULL );
nkeynes@691
   106
    gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item->data), TRUE );
nkeynes@691
   107
    g_list_free(children);
nkeynes@691
   108
nkeynes@691
   109
    gdrom_menu_adjusting = FALSE;
nkeynes@691
   110
    return TRUE;
nkeynes@691
   111
}
nkeynes@691
   112
nkeynes@464
   113
GtkWidget *gdrom_menu_new()
nkeynes@464
   114
{
nkeynes@464
   115
    GtkWidget *menu = gtk_menu_new();
nkeynes@508
   116
    gtk_menu_set_title( GTK_MENU(menu), _("GD-Rom Settings") );
nkeynes@464
   117
nkeynes@464
   118
    gdrom_menu_build(menu);
nkeynes@691
   119
    register_gdrom_list_change_hook(gdrom_menu_update, menu);
nkeynes@691
   120
    gdrom_menu_update( FALSE, gdrom_list_get_selection(), menu );
nkeynes@464
   121
    gtk_widget_show_all(menu);
nkeynes@736
   122
nkeynes@464
   123
    return menu;
nkeynes@464
   124
}
.