OSDN Git Service

popupwnd functionality almost restored
authorevgeny <evgeny@users.sourceforge.jp>
Sat, 20 Aug 2011 13:10:48 +0000 (17:10 +0400)
committerevgeny <evgeny@users.sourceforge.jp>
Sat, 20 Aug 2011 13:10:48 +0000 (17:10 +0400)
16 files changed:
src/Makefile.am
src/Makefile.in
src/dicts.c
src/eb123.glade
src/ebook.c
src/ebook.h
src/hotkeys.c
src/jcode.c
src/jcode.h
src/mainwnd.c
src/mainwnd.h
src/popupwnd.c
src/popupwnd.h
src/prefs.c
src/selection.c [deleted file]
src/selection.h [deleted file]

index 2f407a7..72ee8fd 100644 (file)
@@ -18,7 +18,6 @@ eb123_SOURCES =       audio.c \
                prefs.c \
                render.c \
                renderheadword.c \
-               selection.c \
                textview.c \
                video.c
 
index 63bd2b0..5fadab6 100644 (file)
@@ -55,8 +55,8 @@ am_eb123_OBJECTS = audio.$(OBJEXT) builder.$(OBJEXT) dicts.$(OBJEXT) \
        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)
@@ -226,7 +226,6 @@ eb123_SOURCES = audio.c \
                prefs.c \
                render.c \
                renderheadword.c \
-               selection.c \
                textview.c \
                video.c
 
@@ -336,7 +335,6 @@ distclean-compile:
 @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@
 
index 9c3e6db..ba0e9fb 100644 (file)
@@ -8,7 +8,6 @@
 #include "mainwnd.h"
 #include "popupwnd.h"
 #include "prefs.h"
-#include "selection.h"
 
 G_DEFINE_TYPE(Dicts, dicts, G_TYPE_OBJECT);
 
@@ -753,7 +752,7 @@ static void dicts_selection_changed_cb(GtkTreeSelection *selection, gpointer dat
     //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"));
index 1d18e60..a132107 100644 (file)
     <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>
index 6e093aa..b689e7d 100644 (file)
@@ -25,8 +25,10 @@ struct _search_method methods[] = {
 
 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;
 }
@@ -363,39 +365,49 @@ EB_Error_Code ebook_search_keyword(EB_Book *book, const char *input_word)
     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)
index a428262..1bdc3f7 100644 (file)
@@ -8,8 +8,8 @@ GdkPixbuf*      ebook_load_image(BOOK_INFO *binfo, EB_Position *pos);
 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);
index 9b6a0c5..114a125 100644 (file)
@@ -6,7 +6,6 @@
 #include "hotkeys.h"
 #include "mainwnd.h"
 #include "prefs.h"
-#include "selection.h"
 
 const HOTKEY_COMMAND hotkeys_list[] = {
     { _("Search"),                     mainwnd_search_, FALSE},
@@ -20,8 +19,8 @@ const HOTKEY_COMMAND hotkeys_list[] = {
 //    { _("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}
 };
 
index 4c7af34..83510a4 100644 (file)
@@ -22,3 +22,35 @@ gboolean is_euc_printable(const guchar *buf)
     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);
+}
+
index bdafd6c..4317586 100644 (file)
@@ -5,5 +5,6 @@
 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__ */
index 349563f..09d15f3 100644 (file)
@@ -10,7 +10,6 @@
 #include "mainwnd.h"
 #include "popupwnd.h"
 #include "hotkeys.h"
-#include "selection.h"
 #include "renderheadword.h"
 
 static Mainwnd *_mainwnd = NULL;
@@ -38,6 +37,8 @@ static void mainwnd_init(Mainwnd *self)
     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)
@@ -131,21 +132,13 @@ void mainwnd_search_clear_clicked_cb(GtkWidget *widget, gpointer 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));
@@ -229,8 +222,8 @@ void mainwnd_status_icon_menu(GtkStatusIcon *status_icon, guint button, guint ac
     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);
@@ -431,3 +424,15 @@ void mainwnd_open(Mainwnd *self, RESULT *res)
     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);
+}
+
index dd30239..524a7e1 100644 (file)
@@ -6,6 +6,7 @@
 #include "dicts.h"
 #include "prefs.h"
 #include "textview.h"
+#include "popupwnd.h"
 
 G_BEGIN_DECLS
 
@@ -26,6 +27,7 @@ struct _Mainwnd {
     Prefs      *prefs;
     GSequence  *results;
     TextView   *text;
+    Popupwnd   *popupwnd;
 };
 
 struct _MainwndClass {
@@ -55,22 +57,4 @@ void            mainwnd_reset_font();
 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__ */
index 22f29aa..decde0c 100644 (file)
 #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;
@@ -89,7 +158,7 @@ static gboolean popupwnd_dict_menu_append(GtkTreeModel *model, GtkTreePath *path
         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);
     }
@@ -101,71 +170,219 @@ static gboolean popupwnd_dict_menu_append(GtkTreeModel *model, GtkTreePath *path
         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;
 }
 
@@ -211,6 +428,7 @@ static void popupwnd_scroll_up_cb(GtkWidget *widget, gpointer data)
     popupwnd_scroll_mark(gtk_text_view_get_buffer(GTK_TEXT_VIEW(popupwnd.view)), FALSE);
 }
 
+#if 0
 static void popupwnd_window_create()
 {
     GdkModifierType mask;
@@ -269,20 +487,6 @@ static void popupwnd_window_create()
     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);
@@ -292,11 +496,6 @@ static void popupwnd_window_create()
     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);
@@ -313,6 +512,7 @@ static void popupwnd_window_create()
 
     gtk_widget_show_all(popupwnd.wnd);
 }
+#endif
 
 static gint popupwnd_scroll_to_top()
 {
@@ -338,12 +538,6 @@ void popupwnd_open(RESULT *res)
     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);
@@ -356,35 +550,7 @@ void popupwnd_show(const gchar *word)
     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)
@@ -410,4 +576,4 @@ void popupwnd_search(const gchar *str)
     g_free(euc_str);
     popupwnd_show(str);
 }
-
+#endif
index a067b3e..e17a6e4 100644 (file)
@@ -1,4 +1,53 @@
 
+#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__
 
@@ -6,7 +55,6 @@
 
 void            popupwnd_open(RESULT *res);
 void            popupwnd_close();
-void            popupwnd_search(const gchar *str);
 void           popupwnd_find();
 
 struct _popupwnd
index 4e40194..903673c 100644 (file)
@@ -7,7 +7,6 @@
 #include "mainwnd.h"
 #include "popupwnd.h"
 #include "prefs.h"
-#include "selection.h"
 #include "hotkeys.h"
 #include "textview.h"
 
@@ -159,7 +158,7 @@ static void prefs_get_widget_data(Prefs *p, Builder *b, const gchar *str)
     }
 }
 
-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;
@@ -191,7 +190,7 @@ void prefs_close_wnd()
     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;
@@ -224,7 +223,7 @@ void on_btn_prefs_clicked(GtkWidget *widget, gpointer data)
            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
            {
@@ -232,6 +231,7 @@ void on_btn_prefs_clicked(GtkWidget *widget, gpointer data)
                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]);
diff --git a/src/selection.c b/src/selection.c
deleted file mode 100644 (file)
index 15e6936..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-
-#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();
-}
-
diff --git a/src/selection.h b/src/selection.h
deleted file mode 100644 (file)
index baa75ac..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-
-#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__ */