8f8d2eb849
git-svn-id: https://samskivert.googlecode.com/svn/trunk@285 6335cc39-0255-0410-8fd6-9bcaacd3b74c
210 lines
5.3 KiB
C
210 lines
5.3 KiB
C
/**
|
|
* $Id: binding.c,v 1.2 2001/08/16 20:25:09 mdb Exp $
|
|
*
|
|
* lookuplet - a utility for quickly looking up information
|
|
* Copyright (C) 2001 Michael Bayne
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2.1 of the License, or (at your
|
|
* option) any later version.
|
|
*
|
|
* This program 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
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include <gnome.h>
|
|
#include "binding.h"
|
|
|
|
static gchar* DEFAULT_BINDING_KEYS[] =
|
|
{
|
|
"Control-g",
|
|
"Control-d",
|
|
"Control-Shift-d",
|
|
"Control-f",
|
|
};
|
|
|
|
static LkBindingType DEFAULT_BINDING_TYPES[] =
|
|
{
|
|
URL,
|
|
EXEC,
|
|
URL,
|
|
URL,
|
|
URL,
|
|
};
|
|
|
|
static gchar* DEFAULT_BINDING_NAMES[] =
|
|
{
|
|
"Google search",
|
|
"Dictionary lookup",
|
|
"Debian package search",
|
|
"Freshmeat search",
|
|
"IMDB Title search",
|
|
};
|
|
|
|
static gchar* DEFAULT_BINDING_ARGUMENTS[] =
|
|
{
|
|
"http://www.google.com/search?client=googlet&q=%U",
|
|
"gdict -a %T",
|
|
"http://cgi.debian.org/cgi-bin/search_contents.pl?word=%U&case=insensitive&version=unstable&arch=i386&directories=yes",
|
|
"http://freshmeat.net/search/?q=%U",
|
|
"http://www.imdb.com/Tsearch?title=%U&restrict=Movies+only"
|
|
};
|
|
|
|
#define DEFAULT_BINDING_COUNT \
|
|
(sizeof(DEFAULT_BINDING_TYPES)/sizeof(LkBindingType))
|
|
|
|
LkBinding*
|
|
lk_binding_new (void)
|
|
{
|
|
LkBinding* binding = (LkBinding*)g_malloc(sizeof(LkBinding));
|
|
binding->key = g_strdup("");
|
|
binding->name = g_strdup("");
|
|
binding->argument = g_strdup("");
|
|
return binding;
|
|
}
|
|
|
|
LkBinding*
|
|
lk_binding_new_with_values (const gchar* key, LkBindingType type,
|
|
const gchar* name, const gchar* argument)
|
|
{
|
|
LkBinding* binding = (LkBinding*)g_malloc(sizeof(LkBinding));
|
|
binding->key = g_strdup(key);
|
|
binding->type = type;
|
|
binding->name = g_strdup(name);
|
|
binding->argument = g_strdup(argument);
|
|
return binding;
|
|
}
|
|
|
|
void
|
|
lk_binding_destroy (LkBinding* binding)
|
|
{
|
|
g_free(binding->key);
|
|
g_free(binding->name);
|
|
g_free(binding->argument);
|
|
g_free(binding);
|
|
}
|
|
|
|
void
|
|
lk_binding_init (LkBinding* binding, const gchar* key,
|
|
LkBindingType type, const gchar* name, const gchar* argument)
|
|
{
|
|
g_free(binding->key);
|
|
binding->key = g_strdup(key);
|
|
binding->type = type;
|
|
g_free(binding->name);
|
|
binding->name = g_strdup(name);
|
|
g_free(binding->argument);
|
|
binding->argument = g_strdup(argument);
|
|
}
|
|
|
|
static gchar*
|
|
config_get_string (const gchar* field, gint index)
|
|
{
|
|
gchar gkey[100];
|
|
gchar* value;
|
|
|
|
/* construct the path */
|
|
g_snprintf(gkey, sizeof(gkey),
|
|
"lookuplet/bindings/%s_%.2u", field, index);
|
|
|
|
/* fetch the value and deal with non-existent values */
|
|
value = gnome_config_get_string(gkey);
|
|
if (value == NULL) {
|
|
value = g_strdup("");
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
void
|
|
lk_binding_load_bindings (GPtrArray* bindings)
|
|
{
|
|
gchar gkey[100];
|
|
int count, i;
|
|
|
|
gnome_config_push_prefix("/lookuplet/");
|
|
count = gnome_config_get_int("lookuplet/bindings/count");
|
|
|
|
/* if we have bindings defined, load those */
|
|
if (count > 0) {
|
|
for (i = 0; i < count; i++) {
|
|
gchar* key, *name, *argument;
|
|
LkBindingType type = URL;
|
|
|
|
key = config_get_string("key", i);
|
|
g_snprintf(gkey, sizeof(gkey), "lookuplet/bindings/type_%.2u", i);
|
|
type = (LkBindingType)gnome_config_get_int(gkey);
|
|
name = config_get_string("name", i);
|
|
argument = config_get_string("arg", i);
|
|
|
|
g_ptr_array_add(bindings, lk_binding_new_with_values(
|
|
key, type, name, argument));
|
|
|
|
g_free(key);
|
|
g_free(name);
|
|
g_free(argument);
|
|
}
|
|
|
|
} else {
|
|
/* otherwise use the default bindings */
|
|
for (i = 0; i < DEFAULT_BINDING_COUNT; i++) {
|
|
LkBinding* binding =
|
|
lk_binding_new_with_values(DEFAULT_BINDING_KEYS[i],
|
|
DEFAULT_BINDING_TYPES[i],
|
|
DEFAULT_BINDING_NAMES[i],
|
|
DEFAULT_BINDING_ARGUMENTS[i]);
|
|
g_ptr_array_add(bindings, binding);
|
|
}
|
|
}
|
|
|
|
gnome_config_pop_prefix();
|
|
}
|
|
|
|
void
|
|
lk_binding_save_bindings (GPtrArray* bindings)
|
|
{
|
|
gchar gkey[100];
|
|
int i;
|
|
|
|
gnome_config_push_prefix("/lookuplet/");
|
|
|
|
/* save the total number of bindings */
|
|
gnome_config_set_int("lookuplet/bindings/count", bindings->len);
|
|
|
|
/* save each binding */
|
|
for (i = 0; i < bindings->len; i++) {
|
|
LkBinding* binding = LK_BINDING(g_ptr_array_index(bindings, i));
|
|
|
|
g_snprintf(gkey, sizeof(gkey),
|
|
"lookuplet/bindings/key_%.2u", i);
|
|
gnome_config_set_string(gkey, binding->key);
|
|
|
|
g_snprintf(gkey, sizeof(gkey),
|
|
"lookuplet/bindings/type_%.2u", i);
|
|
gnome_config_set_int(gkey, binding->type);
|
|
|
|
g_snprintf(gkey, sizeof(gkey),
|
|
"lookuplet/bindings/name_%.2u", i);
|
|
gnome_config_set_string(gkey, binding->name);
|
|
|
|
g_snprintf(gkey, sizeof(gkey),
|
|
"lookuplet/bindings/arg_%.2u", i);
|
|
gnome_config_set_string(gkey, binding->argument);
|
|
}
|
|
|
|
/* write our new settings to disk */
|
|
gnome_config_sync();
|
|
|
|
/* cargo cult programming! i dunno, the other guy did this too */
|
|
gnome_config_drop_all();
|
|
|
|
gnome_config_pop_prefix();
|
|
}
|