prefs.c \
render.c \
renderheadword.c \
- selection.c \
textview.c \
video.c
ebook.$(OBJEXT) history.$(OBJEXT) hook.$(OBJEXT) \
hotkeys.$(OBJEXT) jcode.$(OBJEXT) log.$(OBJEXT) \
mainwnd.$(OBJEXT) popupwnd.$(OBJEXT) prefs.$(OBJEXT) \
- render.$(OBJEXT) renderheadword.$(OBJEXT) selection.$(OBJEXT) \
- textview.$(OBJEXT) video.$(OBJEXT)
+ render.$(OBJEXT) renderheadword.$(OBJEXT) textview.$(OBJEXT) \
+ video.$(OBJEXT)
eb123_OBJECTS = $(am_eb123_OBJECTS)
eb123_DEPENDENCIES =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
prefs.c \
render.c \
renderheadword.c \
- selection.c \
textview.c \
video.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prefs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renderheadword.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selection.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textview.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/video.Po@am__quote@
#include "mainwnd.h"
#include "popupwnd.h"
#include "prefs.h"
-#include "selection.h"
G_DEFINE_TYPE(Dicts, dicts, G_TYPE_OBJECT);
//gtk_container_foreach(GTK_CONTAINER(searches), dicts_info_update_search, binfo ? (gpointer)binfo->book : NULL);
}
-void on_btn_dicts_clicked(GtkWidget *widget, gpointer data)
+void dicts_btn_clicked_cb(GtkWidget *widget, gpointer data)
{
Mainwnd *mainwnd = MAINWND(data);
GtkWidget *wnd = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(mainwnd->builder), "dictionaries"));
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
+ <object class="GtkAdjustment" id="adj.popupwnd_h">
+ <property name="lower">100</property>
+ <property name="upper">500</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adj.popupwnd_w">
+ <property name="lower">100</property>
+ <property name="upper">500</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
<object class="GtkAdjustment" id="adj.word_hist">
<property name="upper">100</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
+ <object class="GtkAdjustment" id="ajd.popupwnd_hits">
+ <property name="lower">1</property>
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="ajd.popupwnd_strlen">
+ <property name="lower">10</property>
+ <property name="upper">100</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
<object class="GtkDialog" id="dictionaries">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
- <object class="GtkCheckButton" id="scan">
+ <object class="GtkCheckButton" id="mainwnd_scan">
<property name="label" translatable="yes">Scan</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="mainwnd_scan_toggled_cb" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
- <object class="GtkButton" id="btn_prefs">
+ <object class="GtkButton" id="prefs_btn">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="relief">none</property>
- <signal name="clicked" handler="on_btn_prefs_clicked" swapped="no"/>
+ <signal name="clicked" handler="prefs_btn_clicked_cb" swapped="no"/>
<child>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
</packing>
</child>
<child>
- <object class="GtkButton" id="btn_dicts">
+ <object class="GtkButton" id="dicts_btn">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="relief">none</property>
- <signal name="clicked" handler="on_btn_dicts_clicked" swapped="no"/>
+ <signal name="clicked" handler="dicts_btn_clicked_cb" swapped="no"/>
<child>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
</row>
</data>
</object>
+ <object class="GtkWindow" id="popupwnd">
+ <property name="can_focus">False</property>
+ <property name="type">popup</property>
+ <property name="resizable">False</property>
+ <child>
+ <object class="GtkVBox" id="vbox9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkHBox" id="hbox17">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkEventBox" id="popupwnd_evtbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <signal name="button-press-event" handler="popupwnd_evtbox_button_press_event_cb" swapped="no"/>
+ <signal name="button-release-event" handler="popupwnd_evtbox_button_release_event_cb" swapped="no"/>
+ <signal name="motion-notify-event" handler="popupwnd_evtbox_motion_notify_event_cb" swapped="no"/>
+ <child>
+ <object class="GtkLabel" id="popupwnd_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">label</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="popupwnd_find_btn">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="relief">none</property>
+ <child>
+ <object class="GtkImage" id="image16">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-find</property>
+ <property name="icon-size">2</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="popupwnd_dict_btn">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="popupwnd_dict_btn_clicked_cb" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="image15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-index</property>
+ <property name="icon-size">2</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="popupwnd_lock_btn">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="relief">none</property>
+ <child>
+ <object class="GtkImage" id="image14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-refresh</property>
+ <property name="icon-size">2</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="popupwnd_close_btn">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="popupwnd_close_btn_clicked_cb" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="image13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-close</property>
+ <property name="icon-size">2</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkScrolledWindow" id="popupwnd_scroll">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">etched-in</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label_item">
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
<object class="GtkDialog" id="preferences">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="modal">True</property>
<property name="window_position">center</property>
<property name="type_hint">dialog</property>
- <signal name="delete-event" handler="on_preferences_delete_event" swapped="no"/>
+ <signal name="delete-event" handler="preferences_delete_event_cb" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<object class="GtkLabel" id="label6">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="xalign">0</property>
<property name="label" translatable="yes">Keyword</property>
</object>
<packing>
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="xalign">0</property>
<property name="label" translatable="yes">Dictionary title</property>
</object>
<packing>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="xalign">0</property>
<property name="label" translatable="yes">Link</property>
</object>
</child>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="padding">10</property>
<property name="position">0</property>
</packing>
</child>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="padding">10</property>
<property name="position">0</property>
</packing>
</child>
<property name="can_focus">False</property>
<property name="n_rows">2</property>
<property name="n_columns">2</property>
+ <property name="column_spacing">10</property>
+ <property name="row_spacing">10</property>
<child>
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
<object class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="xalign">0</property>
<property name="label" translatable="yes">Maximum hits to search</property>
</object>
<packing>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="padding">10</property>
<property name="position">0</property>
</packing>
</child>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="padding">10</property>
<property name="position">0</property>
</packing>
</child>
<property name="tab_fill">False</property>
</packing>
</child>
+ <child>
+ <object class="GtkHBox" id="hbox19">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="vbox11">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkHBox" id="hbox20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label25">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Popup window size</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="popupwnd.w">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <property name="adjustment">adj.popupwnd_w</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label26">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes"> x </property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="popupwnd.h">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <property name="adjustment">adj.popupwnd_h</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">10</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="popupwnd.remember_pos">
+ <property name="label" translatable="yes">Remember popup window position</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="popupwnd.jap_only">
+ <property name="label" translatable="yes">Search only japanese text in popup window</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">10</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label20">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Popup window</property>
+ </object>
+ <packing>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHBox" id="hbox18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkVBox" id="vbox10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkTable" id="table3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">10</property>
+ <property name="row_spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label22">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Maximum string length for automatic lookup</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="selection.maxchar">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <property name="adjustment">ajd.popupwnd_strlen</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label23">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Number hits to search in popup window</property>
+ </object>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="popupwnd.maxhits">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="primary_icon_sensitive">True</property>
+ <property name="secondary_icon_sensitive">True</property>
+ <property name="adjustment">adj.maxhits</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label24">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Popup search method</property>
+ </object>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="popupwnd.search_method">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">mainwnd_search_store</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">10</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">10</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label21">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Search</property>
+ </object>
+ <packing>
+ <property name="position">5</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <child>
+ <object class="GtkAlignment" id="alignment7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="left_padding">12</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="label_item">
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label27">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Hotkeys</property>
+ </object>
+ <packing>
+ <property name="position">6</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">True</property>
gint ebook_search_method(gint index)
{
- g_assert(index < 0);
- g_assert(index >= SZ(methods));
+ if(index < 0)
+ index = 0;
+ if(index >= SZ(methods))
+ index = 0;
struct _search_method m = methods[index];
return m.code;
}
return error_code;
}
-void ebook_search_book(const gchar *word, gint method, GSequence *results, gint maxhits, BOOK_INFO *binfo)
+gboolean ebook_search_book(const gchar *word, gint method, GSequence *results, gint maxhits, BOOK_INFO *binfo, gboolean jap_only)
{
-#if 0
+ if(methods[method].have_method(binfo->book) == NULL)
+ return False;
+ gchar *euc_str = iconv_convert(ENC_UTF8, ENC_EUC_JP, word);
+ if(!validate_euc(euc_str, jap_only))
+ {
+ g_free(euc_str);
+ return False;
+ }
if(results)
{
ebook_clear_results(results);
ebook.results = results;
}
-#endif
- if(methods[method].have_method(binfo->book) == NULL)
- return;
- if(methods[method].search(binfo->book, word) == EB_SUCCESS)
+ if(methods[method].search(binfo->book, euc_str) == EB_SUCCESS)
{
- ebook_search_results_save(binfo, word, maxhits);
+ ebook_search_results_save(binfo, euc_str, maxhits);
}
+ g_free(euc_str);
+ return True;
}
-void ebook_search(const gchar *word, gint method, GSequence *results, gint maxhits)
+gboolean ebook_search(const gchar *word, gint method, GSequence *results, gint maxhits, gboolean jap_only)
{
GtkTreeIter iter;
GtkTreeModel *store;
BOOK_INFO *binfo;
+
if(!mainwnd_get_dicts(&store, &iter))
return;
+
ebook_clear_results(results);
ebook.results = results;
+ gboolean ret = False;
do {
gtk_tree_model_get(store, &iter, DICT_BINFO, &binfo, -1);
if(!binfo->active)
continue;
- ebook_search_book(word, method, NULL, maxhits, binfo);
+ ret = ret | ebook_search_book(word, method, NULL, maxhits, binfo, jap_only);
} while (gtk_tree_model_iter_next(store, &iter));
ebook.results = NULL;
+ return ret;
}
void ebook_menu_or_copyright(gboolean menu, GSequence *results)
void ebook_free(BOOK_INFO *binfo);
gchar* ebook_get_text(RESULT *res);
gchar* ebook_get_raw_text(EB_Book *book, gint page, gint offset);
-void ebook_search(const gchar *word, gint method, GSequence *results, gint maxhits);
-void ebook_search_book(const gchar *word, gint method, GSequence *results, gint maxhits, BOOK_INFO *binfo);
+gboolean ebook_search(const gchar *word, gint method, GSequence *results, gint maxhits, gboolean jap_only);
+gboolean ebook_search_book(const gchar *word, gint method, GSequence *results, gint maxhits, BOOK_INFO *binfo, gboolean jap_only);
void ebook_menu_or_copyright(gboolean menu, GSequence *results);
GdkPixbuf* ebook_read_gaiji(BOOK_INFO *binfo, gchar *code, gint *w, gint *h);
EB_Error_Code ebook_search_keyword(EB_Book *book, const char *input_word);
#include "hotkeys.h"
#include "mainwnd.h"
#include "prefs.h"
-#include "selection.h"
const HOTKEY_COMMAND hotkeys_list[] = {
{ _("Search"), mainwnd_search_, FALSE},
// { _("Select previous group"), dictbar_group_prev, FALSE},
{ _("Quit program"), mainwnd_exit, FALSE},
{ _("Iconify/restore main window"), mainwnd_iconify_restore, TRUE},
- { _("Search in main window"), selection_search_in_mainwnd, TRUE},
- { _("Search in popup window"), selection_search_in_popupwnd, TRUE},
+// { _("Search in main window"), selection_search_in_mainwnd, TRUE},
+// { _("Search in popup window"), selection_search_in_popupwnd, TRUE},
{NULL, NULL, FALSE}
};
return ((0xA1 <= buf[0]) && (buf[0] <= 0xF4) && (0xA1 <= buf[1]) && (buf[1] <= 0xFE));
}
+gboolean validate_euc(gchar *str, gboolean jap_only)
+{
+ g_strstrip(str);
+ if(!strlen(str))
+ return False;
+ gchar *p = str;
+ while(*p)
+ {
+ if(is_euc_printable((guchar*)p))
+ {
+ p += 2;
+ continue;
+ }
+ if(!jap_only)
+ {
+ if(isprint(*p))
+ {
+ p++;
+ continue;
+ }
+ else if(isspace(*p))
+ {
+ *p = 0x20;
+ p++;
+ continue;
+ }
+ }
+ return False;
+ }
+ return (p - str);
+}
+
gchar* iconv_convert(const gchar *icode, const gchar *ocode, const gchar *orig);
gboolean is_euc_printable(const guchar *buf);
gboolean is_jis_printable(const guchar *buf);
+gboolean validate_euc(gchar *str, gboolean jap_only);
#endif /* __JCODE_H__ */
#include "mainwnd.h"
#include "popupwnd.h"
#include "hotkeys.h"
-#include "selection.h"
#include "renderheadword.h"
static Mainwnd *_mainwnd = NULL;
GtkContainer *scroll = GTK_CONTAINER(gtk_builder_get_object(GTK_BUILDER(self->builder), "scrolledwindow2"));
self->text = g_object_new(TYPE_TEXTVIEW, NULL);
gtk_container_add(scroll, GTK_WIDGET(self->text));
+ self->popupwnd = g_object_new(TYPE_POPUPWND, "mainwnd", self, "type", GTK_WINDOW_POPUP, NULL);
+ g_printf("mainwd %.8X\n", self);
}
void mainwnd_headword_append(gpointer data, gpointer user_data)
void mainwnd_search(Mainwnd *self, const gchar *word)
{
- gchar *euc_str = iconv_convert(ENC_UTF8, ENC_EUC_JP, word);
gint i = builder_get_int(self->builder, "mainwnd_search");
gint method = ebook_search_method(i);
- g_strstrip(euc_str);
- if(!strlen(euc_str))
- {
- g_free(euc_str);
- return;
- }
//history_insert_word(word);
gint maxhits = prefs_get_int(self->prefs, "headword.maxhits");
g_printf("maxhits = %d\n", maxhits);
- ebook_search(euc_str, method, self->results, maxhits);
- g_free(euc_str);
+ ebook_search(word, method, self->results, maxhits, False);
g_printf("results: %d\n", g_sequence_get_length(self->results));
mainwnd_update_results(self);
gtk_window_deiconify(GTK_WINDOW(self));
GtkWidget *menu = gtk_menu_new(), *item;
popupwnd.scan_status_icon_menu = gtk_check_menu_item_new_with_label(_("Scan"));
gtk_menu_shell_append(GTK_MENU_SHELL(menu), popupwnd.scan_status_icon_menu);
- g_signal_connect(G_OBJECT(popupwnd.scan_status_icon_menu), "toggled", G_CALLBACK(selection_toggled_status_icon_menu), NULL);
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(popupwnd.scan_status_icon_menu), selection.lookup_started);
+ //g_signal_connect(G_OBJECT(popupwnd.scan_status_icon_menu), "toggled", G_CALLBACK(selection_toggled_status_icon_menu), NULL);
+ //gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(popupwnd.scan_status_icon_menu), selection.lookup_started);
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(mainwnd_exit_btn_clicked_cb), NULL);
gtk_widget_show_all(GTK_WIDGET(mainwnd_get_wnd()));
}
+void mainwnd_scan_toggled_cb(GtkToggleButton *btn, gpointer data)
+{
+ Mainwnd *w = MAINWND(data);
+ if(gtk_toggle_button_get_active(btn))
+ {
+ popupwnd_lookup_start(w->popupwnd);
+ //selection_search_in_popupwnd();
+ }
+ else
+ popupwnd_lookup_stop(w->popupwnd);
+}
+
#include "dicts.h"
#include "prefs.h"
#include "textview.h"
+#include "popupwnd.h"
G_BEGIN_DECLS
Prefs *prefs;
GSequence *results;
TextView *text;
+ Popupwnd *popupwnd;
};
struct _MainwndClass {
void mainwnd_clear_combo();
GtkWidget* mainwnd_search_method_combo();
-#if 0
-struct _mainwnd
-{
- gboolean custom_font, remember_pos;
- gchar *font;
- gint x, y, w, h, search;
- GtkWidget *wnd, *combo_method, *combo_word, *dictbar;
- GSequence *results;
-} mainwnd;
-
-struct _paned
-{
- gint treew, treeh;
- GtkWidget *pane, *tree;
- EbTextView *view;
-} paned;
-#endif
-
#endif /* __MAINWND_H__ */
#include "dicts.h"
#include "ebook.h"
#include "jcode.h"
+#include "history.h"
#include "mainwnd.h"
#include "popupwnd.h"
#include "textview.h"
-//#include "toolbar.h"
-void popupwnd_close(GtkWidget *widget, gpointer data)
-{
- if(popupwnd.wnd)
- {
- gtk_window_get_position(GTK_WINDOW(popupwnd.wnd), &popupwnd.x, &popupwnd.y);
- gtk_widget_destroy(popupwnd.wnd);
- popupwnd.wnd = NULL;
- }
-}
+static Popupwnd *_popupwnd = NULL;
-static gboolean popupwnd_close_(gpointer data)
-{
- popupwnd_close(NULL, NULL);
- return FALSE;
-}
+#define SELECTION_TIMEOUT 300
-static void popupwnd_start_stop_timer(gboolean start)
+G_DEFINE_TYPE(Popupwnd, popupwnd, GTK_TYPE_WINDOW);
+
+static void popupwnd_set_property(GObject *object, guint param_id, const GValue *value, GParamSpec *pspec)
{
- static gint timeout_id = 0;
- if(timeout_id != 0)
- g_source_remove(timeout_id);
- timeout_id = 0;
- if(!start || popupwnd.lock)
- return;
- timeout_id = g_timeout_add(popupwnd.timeout, popupwnd_close_, NULL);
+ Popupwnd *w = POPUPWND(object);
+
+ switch(param_id)
+ {
+ case 1:
+ w->mainwnd = g_value_get_pointer(value);
+ Mainwnd *mainwnd = MAINWND(w->mainwnd);
+ w->prefs = mainwnd->prefs;
+ w->builder = mainwnd->builder;
+ GtkWidget *vbox = GTK_WIDGET(gtk_builder_get_object(GTK_BUILDER(w->builder), "vbox9"));
+ gtk_widget_reparent(vbox, GTK_WIDGET(w));
+ GtkContainer *scroll = GTK_CONTAINER(gtk_builder_get_object(GTK_BUILDER(w->builder), "popupwnd_scroll"));
+ w->text = g_object_new(TYPE_TEXTVIEW, NULL);
+ gtk_container_add(scroll, GTK_WIDGET(w->text));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, pspec);
+ break;
+ }
}
-void popupwnd_leave_notify(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
+static void popupwnd_get_property(GObject *object, guint param_id, GValue *value, GParamSpec *pspec)
{
- popupwnd_start_stop_timer((event->detail == GDK_NOTIFY_NONLINEAR) || (event->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL));
+ Popupwnd *w = POPUPWND(object);
+ switch(param_id)
+ {
+ case 1:
+ g_value_set_pointer(value, w->mainwnd);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
}
-void popupwnd_enter_notify(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
+static void popupwnd_class_init(PopupwndClass *klass)
{
- popupwnd_start_stop_timer(FALSE);
+ GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
+ gobject_class->set_property = popupwnd_set_property;
+ gobject_class->get_property = popupwnd_get_property;
+ g_object_class_install_property(gobject_class, 1, g_param_spec_pointer("mainwnd", _("Mainwnd"), _("Mainwnd"), G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
}
-void popupwnd_lock(GtkWidget *widget, gpointer user_data)
+static void popupwnd_init(Popupwnd *self)
{
- popupwnd.lock = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+ if(!_popupwnd)
+ _popupwnd = self;
+ else
+ g_assert(1);
+ //Mainwnd *mainwnd = MAINWND(self->mainwnd);
+ //g_printf("popupwnd constructor mainwnd %.8X\n", self->mainwnd);
+ self->timeout_id = 0;
+ self->lookup_started = False;
+ self->lookup_suspended = True;
+ self->drag = False;
+ self->menu = NULL;
+ self->binfo = NULL;
+ self->results = g_sequence_new(result_free);
+ self->x = -1;
+ self->y = -1;
+ gtk_window_set_position(GTK_WINDOW(self), GTK_WIN_POS_CENTER);
}
-void popupwnd_query_in_mainwnd(GtkWidget *widget, gpointer data)
+static const gchar* popupwnd_selection_copy(Popupwnd *self, gboolean force_copy)
{
- const gchar *str = gtk_label_get_text(GTK_LABEL(popupwnd.label));
- //mainwnd_search(str);
- gtk_window_deiconify(mainwnd_get_wnd());
+ GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+ gchar *str = gtk_clipboard_wait_for_text(clipboard);
+ static gchar *sel = NULL, *sel_prev = NULL;
+ gint maxchar = prefs_get_int(self->prefs, "selection.maxchar");
+ if(!str || (self->lookup_suspended && !force_copy))
+ {
+ if(sel_prev)
+ g_free(sel_prev);
+ sel_prev = NULL;
+ return NULL;
+ }
+ g_strstrip(str);
+ if(strlen(str) > maxchar)
+ {
+ if(sel_prev)
+ g_free(sel_prev);
+ sel_prev = NULL;
+ g_free(str);
+ return NULL;
+ }
+ if(force_copy)
+ sel = str;
+ else
+ {
+ if(!sel)
+ {
+ sel = str;
+ return NULL;
+ }
+ if(strncmp(str, sel, maxchar))
+ {
+ g_free(sel);
+ sel = str;
+ return NULL;
+ }
+ g_free(str);
+ if((sel_prev) ? !strncmp(sel_prev, sel, maxchar) : FALSE)
+ return NULL;
+ }
+ sel_prev = sel;
+ sel = NULL;
+ return sel_prev;
}
-static void popupwnd_dict_changed(GtkWidget *w, gpointer data)
+static void popupwnd_dict_changed_cb(GtkWidget *w, gpointer data)
{
- popupwnd.binfo = (BOOK_INFO*)data;
- popupwnd.lock = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(popupwnd.lockbtn));
- popupwnd_search(NULL);
+ _popupwnd->binfo = (BOOK_INFO*)data;
+ //_popupwnd->lock = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(popupwnd.lockbtn));
+ //popupwnd_search(NULL);
}
static gboolean popupwnd_dict_menu_append(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
{
+ Popupwnd *w = POPUPWND(data);
static GSList *group = NULL;
static GtkWidget *submenu = NULL;
GtkWidget *item;
if(!model)
{
- if(popupwnd.menu)
- gtk_widget_destroy(popupwnd.menu);
+ if(w->menu)
+ gtk_widget_destroy(w->menu);
group = NULL;
- popupwnd.menu = gtk_menu_new();
+ w->menu = gtk_menu_new();
item = gtk_radio_menu_item_new_with_label(group, _("Main window selection"));
- g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(popupwnd_dict_changed), NULL);
+ g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(popupwnd_dict_changed_cb), NULL);
group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));
- gtk_menu_shell_append(GTK_MENU_SHELL(popupwnd.menu), item);
+ gtk_menu_shell_append(GTK_MENU_SHELL(w->menu), item);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
submenu = NULL;
return FALSE;
gchar *name;
submenu = gtk_menu_new();
gtk_tree_model_get(model, iter, DICT_ALIAS, &name, -1);
- gtk_menu_shell_append(GTK_MENU_SHELL(popupwnd.menu), item = gtk_menu_item_new_with_label(name));
+ gtk_menu_shell_append(GTK_MENU_SHELL(w->menu), item = gtk_menu_item_new_with_label(name));
gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
g_free(name);
}
item = gtk_radio_menu_item_new_with_label(group, binfo->title);
group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item));
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), item);
- if(binfo == popupwnd.binfo)
+ if(binfo == w->binfo)
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
- g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(popupwnd_dict_changed), binfo);
+ g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(popupwnd_dict_changed_cb), binfo);
g_free(name);
}
return FALSE;
}
-static void popupwnd_dict_menu_create(gboolean newmenu)
+static void popupwnd_dict_menu_create(Popupwnd *self, gboolean newmenu)
{
-#if 0
if(newmenu || !popupwnd.menu)
{
- popupwnd_dict_menu_append(NULL, NULL, NULL, NULL);
- gtk_tree_model_foreach(GTK_TREE_MODEL(dicts.store), popupwnd_dict_menu_append, NULL);
- if(popupwnd.binfo)
+ popupwnd_dict_menu_append(NULL, NULL, NULL, self);
+ GtkTreeModel *store = GTK_TREE_MODEL(gtk_builder_get_object(GTK_BUILDER(self->builder), "dicts_store"));
+ gtk_tree_model_foreach(GTK_TREE_MODEL(store), popupwnd_dict_menu_append, self);
+ if(self->binfo)
{
- if(!dicts_find_path(popupwnd.binfo->book))
- popupwnd.binfo = NULL;
+ if(!dicts_find_path(self->binfo->book))
+ self->binfo = NULL;
}
}
-#endif
}
-static void popupwnd_set_dict(GtkWidget *widget, gpointer data)
+void popupwnd_dict_btn_clicked_cb(GtkWidget *widget, gpointer data)
{
- popupwnd_dict_menu_create(False);
- popupwnd.lock = TRUE;
- gtk_widget_show_all(popupwnd.menu);
- gtk_menu_popup(GTK_MENU(popupwnd.menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
+ popupwnd_dict_menu_create(_popupwnd, False);
+ _popupwnd->lock = TRUE;
+ gtk_widget_show_all(_popupwnd->menu);
+ gtk_menu_popup(GTK_MENU(_popupwnd->menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
+}
+
+void popupwnd_render(gpointer data, gpointer user_data)
+{
+ Popupwnd *w = POPUPWND(user_data);
+ RESULT *res = (RESULT*)data;
+ textview_open(w->text, res, w->prefs, FALSE, 0);
+}
+
+void popupwnd_search(Popupwnd *self, const gchar *str)
+{
+ g_printf("search: %s\n", str);
+
+ gint search_method = prefs_get_int(self->prefs, "popupwnd.search_method");
+ gint maxhits = prefs_get_int(self->prefs, "popupwnd.maxhits");
+ gint jap_only = prefs_get_int(self->prefs, "popupwnd.jap_only");
+ gboolean b = False;
+ if(self->binfo)
+ b = ebook_search_book(str, popupwnd.search_method, self->results, maxhits, self->binfo, jap_only);
+ else
+ b = ebook_search(str, popupwnd.search_method, self->results, maxhits, jap_only);
+ if(!b)
+ return;
+
+ popupwnd_dict_menu_create(self, False);
+ GtkLabel *label = GTK_LABEL(gtk_builder_get_object(GTK_BUILDER(self->builder), "popupwnd_label"));
+ gtk_label_set_text(label, str);
+
+ textview_clear_textbuf(self->text);
+ if(g_sequence_get_length(self->results))
+ g_sequence_foreach(self->results, popupwnd_render, self);
+ else
+ textview_insert_message(self->text, "<No hits>", TRUE);
+ gtk_window_present(GTK_WINDOW(self));
+ if((self->x > 0) && (self->y > 0))
+ gtk_window_move(GTK_WINDOW(_popupwnd), self->x, self->y);
+
+ gint w = prefs_get_int(self->prefs, "popupwnd.w");
+ gint h = prefs_get_int(self->prefs, "popupwnd.h");
+ w = (w > 100) ? w : 100;
+ h = (h > 100) ? h : 100;
+ gtk_widget_set_size_request(GTK_WIDGET(self), w, h);
+
+ gtk_widget_show_all(GTK_WIDGET(self));
+}
+
+gint popupwnd_search_cb(gpointer data)
+{
+ Popupwnd *self = POPUPWND(data);
+ const gchar *sel = popupwnd_selection_copy(self, False);
+ if(sel)
+ popupwnd_search(self, sel);
+ return 1;
+}
+
+void popupwnd_lookup_resume(Popupwnd *self)
+{
+ if(self->lookup_started)
+ {
+ if(self->timeout_id != 0)
+ g_source_remove(self->timeout_id);
+ self->timeout_id = g_timeout_add(SELECTION_TIMEOUT, popupwnd_search_cb, self);
+ //gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(popupwnd.scan), TRUE);
+ }
+ self->lookup_suspended = FALSE;
+}
+
+void popupwnd_lookup_start(Popupwnd *self)
+{
+ self->lookup_started = TRUE;
+ //gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(popupwnd.scan), TRUE);
+ popupwnd_lookup_resume(self);
+}
+
+void popupwnd_lookup_suspend(Popupwnd *self)
+{
+ if(self->timeout_id != 0)
+ g_source_remove(self->timeout_id);
+ self->timeout_id = 0;
+ //popupwnd_close(NULL, NULL);
+ self->lookup_suspended = TRUE;
+}
+
+void popupwnd_lookup_stop(Popupwnd *self)
+{
+ self->lookup_started = False;
+ //gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(popupwnd.scan), TRUE);
+ popupwnd_lookup_suspend(self);
}
-static gint popupwnd_title_motion_notify_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data)
+void popupwnd_close(GtkWidget *widget, gpointer data)
{
- if(!popupwnd.drag)
+ if(popupwnd.wnd)
+ {
+ gtk_window_get_position(GTK_WINDOW(popupwnd.wnd), &popupwnd.x, &popupwnd.y);
+ gtk_widget_destroy(popupwnd.wnd);
+ popupwnd.wnd = NULL;
+ }
+}
+
+static gboolean popupwnd_close_(gpointer data)
+{
+ popupwnd_close(NULL, NULL);
+ return FALSE;
+}
+
+static void popupwnd_start_stop_timer(gboolean start)
+{
+ static gint timeout_id = 0;
+ if(timeout_id != 0)
+ g_source_remove(timeout_id);
+ timeout_id = 0;
+ if(!start || popupwnd.lock)
+ return;
+ timeout_id = g_timeout_add(popupwnd.timeout, popupwnd_close_, NULL);
+}
+
+void popupwnd_leave_notify(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
+{
+ popupwnd_start_stop_timer((event->detail == GDK_NOTIFY_NONLINEAR) || (event->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL));
+}
+
+void popupwnd_enter_notify(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
+{
+ popupwnd_start_stop_timer(FALSE);
+}
+
+void popupwnd_lock(GtkWidget *widget, gpointer user_data)
+{
+ popupwnd.lock = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+}
+
+void popupwnd_query_in_mainwnd(GtkWidget *widget, gpointer data)
+{
+ const gchar *str = gtk_label_get_text(GTK_LABEL(popupwnd.label));
+ //mainwnd_search(str);
+ gtk_window_deiconify(mainwnd_get_wnd());
+}
+
+void popupwnd_close_btn_clicked_cb(GtkWidget *widget, gpointer data)
+{
+ //Mainwnd *w = MAINWND(data);
+ //GtkWindow *w = gtk_widget_get_parent_window(widget);
+ gtk_widget_hide(GTK_WIDGET(_popupwnd));
+}
+
+gint popupwnd_evtbox_motion_notify_event_cb(GtkWidget *widget, GdkEventMotion *event, gpointer data)
+{
+ if(!_popupwnd->drag)
return TRUE;
- gint x = popupwnd.press_window_x + event->x_root - popupwnd.press_x_root;
- gint y = popupwnd.press_window_y + event->y_root - popupwnd.press_y_root;
+ gint x = _popupwnd->dx + event->x_root;
+ gint y = _popupwnd->dy + event->y_root;
if(x < 0) x = 0;
if(y < 0) y = 0;
- gtk_window_move(GTK_WINDOW(popupwnd.wnd), x, y);
+ gtk_window_move(GTK_WINDOW(_popupwnd), x, y);
+ _popupwnd->x = x;
+ _popupwnd->y = y;
return TRUE;
}
-static gint popupwnd_title_button_press_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
+gint popupwnd_evtbox_button_press_event_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
if(event->type==GDK_2BUTTON_PRESS)
{
- popupwnd.drag = FALSE;
- popupwnd_close(NULL, NULL);
+ _popupwnd->drag = FALSE;
+ //popupwnd_close(NULL, NULL);
}
else
{
- popupwnd.drag = TRUE;
- popupwnd.press_x_root = event->x_root;
- popupwnd.press_y_root = event->y_root;
- gtk_window_get_position(GTK_WINDOW(popupwnd.wnd), &popupwnd.press_window_x, &popupwnd.press_window_y);
+ _popupwnd->drag = TRUE;
+ gint ex, ey, wx, wy;
+ ex = event->x_root;
+ ey = event->y_root;
+ gtk_window_get_position(GTK_WINDOW(_popupwnd), &wx, &wy);
+ _popupwnd->dx = wx - ex;
+ _popupwnd->dy = wy - ey;
}
return FALSE;
}
-static gint popupwnd_title_button_release_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
+gint popupwnd_evtbox_button_release_event_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
- popupwnd.drag = FALSE;
+ _popupwnd->drag = FALSE;
return FALSE;
}
popupwnd_scroll_mark(gtk_text_view_get_buffer(GTK_TEXT_VIEW(popupwnd.view)), FALSE);
}
+#if 0
static void popupwnd_window_create()
{
GdkModifierType mask;
popupwnd.label = gtk_label_new("");
gtk_container_add(GTK_CONTAINER(eventbox), popupwnd.label);
-#if 0
- btn = toolbar_button(popupwnd_query_in_mainwnd, GTK_STOCK_FIND, _("Query in the main window"), TRUE);
- gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 2);
-
- btn = toolbar_button(popupwnd_set_dict, GTK_STOCK_INDEX, _("Select dictionary"), TRUE);
- gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 2);
-
- btn = toolbar_button(popupwnd_scroll_up_cb, GTK_STOCK_GO_BACK, _("Scroll up to the previous result"), TRUE);
- gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 2);
-
- btn = toolbar_button(popupwnd_scroll_down_cb, GTK_STOCK_GO_FORWARD, _("Scroll down to the next result"), TRUE);
- gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 2);
-#endif
-
popupwnd.lockbtn = gtk_toggle_button_new();
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(popupwnd.lockbtn), popupwnd.lock);
gtk_button_set_relief(GTK_BUTTON(popupwnd.lockbtn), GTK_RELIEF_NONE);
image = gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_container_add(GTK_CONTAINER(popupwnd.lockbtn), image);
-#if 0
- btn = toolbar_button(popupwnd_close, GTK_STOCK_CLOSE, _("Close popup window"), TRUE);
- gtk_box_pack_start(GTK_BOX(hbox), btn, FALSE, FALSE, 2);
-#endif
-
frame = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
gtk_widget_show_all(popupwnd.wnd);
}
+#endif
static gint popupwnd_scroll_to_top()
{
popupwnd_scroll_to_top();
}
-void popupwnd_render(gpointer data, gpointer user_data)
-{
- RESULT *res = (RESULT*)data;
- popupwnd_open(res);
-}
-
void popupwnd_show(const gchar *word)
{
textview_clear_textbuf(popupwnd.view);
gtk_window_present(GTK_WINDOW(popupwnd.wnd));
}
-static gboolean popupwnd_validate_euc(gchar *str)
-{
- gchar *p = str;
- while(*p)
- {
- if(is_euc_printable((guchar*)p))
- {
- p += 2;
- continue;
- }
- if(!popupwnd.jap_only)
- {
- if(isprint(*p))
- {
- p++;
- continue;
- }
- else if(isspace(*p))
- {
- *p = 0x20;
- p++;
- continue;
- }
- }
- return FALSE;
- }
- return (p - str);
-}
-
+#if 0
void popupwnd_search(const gchar *str)
{
if(!str)
g_free(euc_str);
popupwnd_show(str);
}
-
+#endif
+#ifndef __POPUPWND_H__
+#define __POPUPWND_H__
+
+#include "builder.h"
+#include "dicts.h"
+#include "prefs.h"
+#include "textview.h"
+
+G_BEGIN_DECLS
+
+#define TYPE_POPUPWND (popupwnd_get_type ())
+#define POPUPWND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_POPUPWND, Popupwnd))
+#define POPUPWND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_POPUPWND, PopupwndClass))
+#define IS_POPUPWND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_POPUPWND))
+#define IS_POPUPWND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_POPUPWND))
+#define POPUPWND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_POPUPWND, PopupwndClass))
+
+typedef struct _Popupwnd Popupwnd;
+typedef struct _PopupwndClass PopupwndClass;
+
+struct _Popupwnd {
+ GtkWindow parent_instance;
+ GtkWidget *menu;
+ gpointer *mainwnd;
+ Builder *builder;
+ Dicts *dicts;
+ Prefs *prefs;
+ GSequence *results;
+ TextView *text;
+ gint lookup_started, lookup_suspended, x, y, dx, dy;
+ guint timeout_id;
+ gboolean drag, lock;
+ BOOK_INFO *binfo;
+};
+
+struct _PopupwndClass {
+ GtkWindowClass parent_class;
+};
+
+void popupwnd_search(Popupwnd *self, const gchar *str);
+void popupwnd_lookup_start(Popupwnd *self);
+void popupwnd_lookup_stop(Popupwnd *self);
+
+GType popupwnd_get_type (void);
+
+G_END_DECLS
+
+#endif /* __POPUPWND_H__ */
+
#ifndef __POPUP_H__
#define __POPUP_H__
void popupwnd_open(RESULT *res);
void popupwnd_close();
-void popupwnd_search(const gchar *str);
void popupwnd_find();
struct _popupwnd
#include "mainwnd.h"
#include "popupwnd.h"
#include "prefs.h"
-#include "selection.h"
#include "hotkeys.h"
#include "textview.h"
}
}
-gboolean on_preferences_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+gboolean preferences_delete_event_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
gtk_widget_hide(widget);
return TRUE;
prefs_cancel_btn_clicked_cb(w, NULL);
}
-void on_btn_prefs_clicked(GtkWidget *widget, gpointer data)
+void prefs_btn_clicked_cb(GtkWidget *widget, gpointer data)
{
Mainwnd *mainwnd = MAINWND(data);
Prefs *prefs = mainwnd->prefs;
if(text[0] != '_')
{
gtk_tree_store_append(prefs_store, &iter1, NULL);
- gtk_tree_store_set(prefs_store, &iter1, 0, _(text), 1, 0, -1);
+ gtk_tree_store_set(prefs_store, &iter1, 0, _(text), 1, i, -1);
}
else
{
gtk_tree_store_set(prefs_store, &iter2, 0, _(&(text[1])), 1, i, -1);
}
}
+ builder_install_text_cellrenderer(mainwnd->builder, "popupwnd.search_method");
for(i = 0; i < SZ(prefs_list); i++)
{
pref1 *p1 = &(prefs_list[i]);
+++ /dev/null
-
-#include "defs.h"
-
-#include "mainwnd.h"
-#include "popupwnd.h"
-#include "selection.h"
-
-#define SELECTION_TIMEOUT 300
-
-static const gchar* selection_copy(gboolean force_copy)
-{
- GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
- gchar *str = gtk_clipboard_wait_for_text(clipboard);
- static gchar *sel = NULL, *sel_prev = NULL;
- if(!str || (selection.lookup_suspended && !force_copy))
- {
- if(sel_prev)
- g_free(sel_prev);
- sel_prev = NULL;
- return NULL;
- }
- g_strstrip(str);
- if(strlen(str) > selection.maxchar)
- {
- if(sel_prev)
- g_free(sel_prev);
- sel_prev = NULL;
- g_free(str);
- return NULL;
- }
- if(force_copy)
- sel = str;
- else
- {
- if(!sel)
- {
- sel = str;
- return NULL;
- }
- if(strncmp(str, sel, selection.maxchar))
- {
- g_free(sel);
- sel = str;
- return NULL;
- }
- g_free(str);
- if((sel_prev) ? !strncmp(sel_prev, sel, selection.maxchar) : FALSE)
- return NULL;
- }
- sel_prev = sel;
- sel = NULL;
- return sel_prev;
-}
-
-gint selection_search_in_popupwnd_cb(gpointer data)
-{
- const gchar *sel = selection_copy(False);
- if(sel)
- popupwnd_search(sel);
- return 1;
-}
-
-void selection_search_in_mainwnd()
-{
-#if 0
- const gchar *sel = selection_copy(TRUE);
- if(sel)
- mainwnd_search(sel);
-#endif
-}
-
-void selection_search_in_popupwnd()
-{
- const gchar *sel = selection_copy(TRUE);
- if(sel)
- popupwnd_search(sel);
-}
-
-void selection_lookup_start()
-{
- selection.lookup_started = TRUE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(popupwnd.scan), TRUE);
- selection_lookup_resume();
-}
-
-void selection_lookup_stop()
-{
- selection.lookup_started = FALSE;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(popupwnd.scan), FALSE);
- selection_lookup_suspend();
-}
-
-void selection_lookup_suspend()
-{
- if(selection.timeout_id != 0)
- g_source_remove(selection.timeout_id);
- selection.timeout_id = 0;
- popupwnd_close(NULL, NULL);
- selection.lookup_suspended = TRUE;
-}
-
-void selection_lookup_resume()
-{
- if(selection.lookup_started)
- {
- if(selection.timeout_id != 0)
- g_source_remove(selection.timeout_id);
- selection.timeout_id = g_timeout_add(SELECTION_TIMEOUT, selection_search_in_popupwnd_cb, NULL);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(popupwnd.scan), TRUE);
- }
- selection.lookup_suspended = FALSE;
-}
-
-void selection_toggled(GtkToggleButton *togglebutton, gpointer data)
-{
- if(gtk_toggle_button_get_active(togglebutton))
- {
- selection_lookup_start();
- selection_search_in_popupwnd();
- }
- else
- selection_lookup_stop();
-}
-
-void selection_toggled_status_icon_menu(GtkCheckMenuItem *checkmenuitem, gpointer data)
-{
- if(gtk_check_menu_item_get_active(checkmenuitem))
- {
- selection_lookup_start();
- selection_search_in_popupwnd();
- }
- else
- selection_lookup_stop();
-}
-
+++ /dev/null
-
-#ifndef __SELECTION_H__
-#define __SELECTION_H__
-
-void selection_toggled(GtkToggleButton *togglebutton, gpointer data);
-void selection_toggled_status_icon_menu(GtkCheckMenuItem *checkmenuitem, gpointer data);
-void selection_lookup_start();
-void selection_lookup_stop();
-void selection_lookup_suspend();
-void selection_lookup_resume();
-void selection_search_in_mainwnd();
-void selection_search_in_popupwnd();
-
-struct _selection
-{
- gboolean lookup_started, lookup_suspended;
- glong maxchar;
- guint timeout_id;
-} selection;
-
-#endif /* __SELECTION_H__ */