]> de.git.xonotic.org Git - xonotic/netradiant.git/commitdiff
Merge commit 'ff48e71434a414958e6e56628ccf04284d030784' into master-merge
authorThomas Debesse <dev@illwieckz.net>
Mon, 20 Jun 2022 02:51:00 +0000 (04:51 +0200)
committerThomas Debesse <dev@illwieckz.net>
Mon, 20 Jun 2022 02:51:00 +0000 (04:51 +0200)
Makefile
libs/gtkutil/xorrectangle.cpp
radiant/CMakeLists.txt
radiant/gtktheme.cpp [new file with mode: 0644]
radiant/gtktheme.h [new file with mode: 0644]
radiant/main.cpp
radiant/mainframe.cpp
radiant/texwindow.cpp
radiant/xywindow.cpp

index 4a4e0bb2084e1a9e2e19084427b93bb22e8e8116..29471bdefd3dd6964fa350a88863c40977da6541 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -682,6 +682,7 @@ $(INSTALLDIR)/radiant.$(EXE): \
        radiant/groupdialog.o \
        radiant/gtkdlgs.o \
        radiant/gtkmisc.o \
+       radiant/gtktheme.o \
        radiant/help.o \
        radiant/image.o \
        radiant/mainframe.o \
index 56ae908a2e911c3ab7e65b6220d18dc6eed2e684..17d48bf9d097d3e103c6dd12866dc88a3d20be6e 100644 (file)
@@ -2,6 +2,13 @@
 
 #include <gtk/gtk.h>
 
+#include "gtkutil/glwidget.h"
+#include "igl.h"
+
+#include <gtk/gtkglwidget.h>
+
+//#include "stream/stringstream.h"
+
 bool XORRectangle::initialised() const
 {
     return !!cr;
@@ -46,9 +53,51 @@ XORRectangle::~XORRectangle()
 void XORRectangle::set(rectangle_t rectangle)
 {
     if (gtk_widget_get_realized(m_widget)) {
-        lazy_init();
-        draw();
-        m_rectangle = rectangle;
-        draw();
+               if( m_rectangle.w != rectangle.w || m_rectangle.h != rectangle.h ){
+               //if( !(m_rectangle.w == 0 && m_rectangle.h == 0 && rectangle.w == 0 && rectangle.h == 0) ){
+               //globalOutputStream() << "m_x" << m_rectangle.x << " m_y" << m_rectangle.y << " m_w" << m_rectangle.w << " m_h" << m_rectangle.h << "\n";
+               //globalOutputStream() << "__x" << rectangle.x << " __y" << rectangle.y << " __w" << rectangle.w << " __h" << rectangle.h << "\n";
+                       if ( glwidget_make_current( m_widget ) != FALSE ) {
+                               GlobalOpenGL_debugAssertNoErrors();
+
+                               gint width, height;
+                               gdk_gl_drawable_get_size( gtk_widget_get_gl_drawable( m_widget ), &width, &height );
+
+                               glViewport( 0, 0, width, height );
+                               glMatrixMode( GL_PROJECTION );
+                               glLoadIdentity();
+                               glOrtho( 0, width, 0, height, -100, 100 );
+                               glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+                               glDisable( GL_DEPTH_TEST );
+
+                               glDrawBuffer( GL_FRONT );
+
+                               glEnable( GL_BLEND );
+                               glBlendFunc( GL_ONE_MINUS_DST_COLOR, GL_ZERO );
+
+                               glLineWidth( 2 );
+                               glColor3f( 1, 1, 1 );
+                               glDisable( GL_TEXTURE_2D );
+                               glBegin( GL_LINE_LOOP );
+                               glVertex2f( m_rectangle.x, m_rectangle.y + m_rectangle.h );
+                               glVertex2f( m_rectangle.x + m_rectangle.w, m_rectangle.y + m_rectangle.h );
+                               glVertex2f( m_rectangle.x + m_rectangle.w, m_rectangle.y );
+                               glVertex2f( m_rectangle.x, m_rectangle.y );
+                               glEnd();
+
+                               glBegin( GL_LINE_LOOP );
+                               glVertex2f( rectangle.x, rectangle.y + rectangle.h );
+                               glVertex2f( rectangle.x + rectangle.w, rectangle.y + rectangle.h );
+                               glVertex2f( rectangle.x + rectangle.w, rectangle.y );
+                               glVertex2f( rectangle.x, rectangle.y );
+                               glEnd();
+
+                               glDrawBuffer( GL_BACK );
+                               GlobalOpenGL_debugAssertNoErrors();
+                               //glwidget_swap_buffers( m_widget );
+                               glwidget_make_current( m_widget );
+                       }
+               }
+               m_rectangle = rectangle;
     }
 }
index 08e76bcf0a839f78b90ca38f14ca5432df6b263e..ae33bcea7dd884f5b0babe17e55691a6b323517b 100644 (file)
@@ -41,6 +41,7 @@ set(RADIANTLIST
     groupdialog.cpp groupdialog.h
     gtkdlgs.cpp gtkdlgs.h
     gtkmisc.cpp gtkmisc.h
+       gtktheme.cpp gtktheme.h
     help.cpp help.h
     image.cpp image.h
     main.cpp main.h
diff --git a/radiant/gtktheme.cpp b/radiant/gtktheme.cpp
new file mode 100644 (file)
index 0000000..c9508f5
--- /dev/null
@@ -0,0 +1,758 @@
+/***************************************************************************
+                          main.cpp  -  description
+                             -------------------
+    begin                : Wed Jan  1 19:06:46 GMT+4 2003
+    copyright            : (C) 2003 - 2005 by Alex Shaduri
+    email                : ashaduri '@' gmail.com
+ ***************************************************************************/
+
+#define GARUX_DISABLE_GTKTHEME
+#ifndef GARUX_DISABLE_GTKTHEME
+
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+#include <sstream>
+#include <gtk/gtk.h>
+
+#ifdef _WIN32
+#include <io.h>
+#else
+#include <sys/stat.h>
+#endif
+
+#include <unistd.h>
+
+
+#include <sys/types.h>
+#include <string.h>
+#include <stdio.h>
+#include <gdk/gdkkeysyms.h>
+
+
+#include "gtktheme.h"
+#include "mainframe.h"
+//#include "gtkutil/window.h"
+
+// ------------------------------------------------------
+
+
+std::string& get_orig_theme();
+std::string& get_orig_font();
+
+std::string get_current_theme();
+std::string get_current_font();
+
+std::string get_selected_theme();
+std::string get_selected_font();
+
+void set_theme(const std::string& theme_name, const std::string& font);
+void apply_theme(const std::string& theme_name, const std::string& font);
+
+
+
+GtkWidget* g_main_rc_window = NULL;
+
+
+static std::string s_rc_file;
+
+
+
+// ------------------------------------------------------
+
+
+
+GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name){
+    GtkWidget *parent, *found_widget;
+
+    for (;;)
+    {
+        if (GTK_IS_MENU (widget))
+            parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+        else
+            parent = widget->parent;
+        if (!parent)
+            parent = (GtkWidget*)g_object_get_data (G_OBJECT (widget), "GladeParentKey");
+        if (parent == NULL)
+            break;
+        widget = parent;
+    }
+
+    found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),
+                   widget_name);
+    if (!found_widget)
+        g_warning ("Widget not found: %s", widget_name);
+    return found_widget;
+}
+
+
+
+
+
+
+void on_main_cancel_button_clicked( GtkButton *button, gpointer user_data ){
+       set_theme( get_orig_theme(), get_orig_font() );
+       gtk_widget_destroy( g_main_rc_window );
+       g_main_rc_window = NULL;
+}
+
+
+void on_main_reset_button_clicked( GtkButton *button, gpointer user_data ){
+       set_theme( get_orig_theme(), get_orig_font() );
+}
+
+
+gboolean on_main_window_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data ){
+       set_theme( get_orig_theme(), get_orig_font() );
+       gtk_widget_destroy( g_main_rc_window );
+       g_main_rc_window = NULL;
+       return TRUE;
+}
+
+
+void on_main_use_default_font_radio_toggled ( GtkToggleButton *togglebutton, gpointer user_data ){
+       bool default_font = gtk_toggle_button_get_active( togglebutton );
+
+       gtk_widget_set_sensitive( lookup_widget( g_main_rc_window, "main_font_selector_button" ), !default_font );
+
+       apply_theme( get_selected_theme(), get_selected_font() );
+}
+
+
+void on_main_font_selector_button_font_set( GtkFontButton *fontbutton, gpointer user_data ){
+       apply_theme( get_selected_theme(), get_selected_font() );
+}
+
+void on_main_ok_button_clicked( GtkButton *button, gpointer user_data ){
+       gtk_widget_destroy( g_main_rc_window );
+       g_main_rc_window = NULL;
+}
+
+
+
+#define GLADE_HOOKUP_OBJECT(component,widget,name) \
+  g_object_set_data_full (G_OBJECT (component), name, \
+    gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
+
+#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
+  g_object_set_data (G_OBJECT (component), name, widget)
+
+GtkWidget*
+create_rc_window (void)
+{
+  GtkWidget *main_window;
+  GtkWidget *main_hbox;
+  GtkWidget *vbox1;
+  GtkWidget *hbox1;
+  GtkWidget *frame2;
+  GtkWidget *alignment3;
+  GtkWidget *scrolledwindow3;
+  GtkWidget *main_themelist;
+  GtkWidget *label1234;
+  GtkWidget *frame3;
+  GtkWidget *alignment4;
+  GtkWidget *vbox7;
+  GtkWidget *hbox8;
+  GtkWidget *vbox9;
+  GtkWidget *main_use_default_font_radio;
+  GSList *main_use_default_font_radio_group = NULL;
+  GtkWidget *main_use_custom_font_radio;
+  GtkWidget *alignment5;
+  GtkWidget *vbox10;
+  GtkWidget *hbox9;
+  GtkWidget *vbox11;
+  GtkWidget *main_font_selector_button;
+  GtkWidget *label669;
+  GtkWidget *vbox13;
+  GtkWidget *hbuttonbox1;
+  GtkWidget *hbox7;
+  GtkWidget *vbox6;
+  GtkWidget *hbox5;
+  GtkWidget *main_ok_button;
+  GtkWidget *main_cancel_button;
+  GtkWidget *main_reset_button;
+  GtkWidget *alignment2;
+  GtkWidget *hbox6;
+  GtkWidget *image1;
+  GtkWidget *label667;
+  GtkAccelGroup *accel_group;
+  GtkTooltips *tooltips;
+
+  tooltips = gtk_tooltips_new ();
+
+  accel_group = gtk_accel_group_new ();
+
+  main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_name (main_window, "main_window");
+  gtk_window_set_title (GTK_WINDOW (main_window), "Gtk2 Theme Selector");
+  gtk_window_set_transient_for( GTK_WINDOW (main_window), MainFrame_getWindow() );
+  gtk_window_set_destroy_with_parent( GTK_WINDOW (main_window), TRUE );
+
+  //gtk_window_set_keep_above ( GTK_WINDOW( main_window ), TRUE );
+
+  main_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_set_name (main_hbox, "main_hbox");
+  gtk_widget_show (main_hbox);
+  gtk_container_add (GTK_CONTAINER (main_window), main_hbox);
+  gtk_widget_set_size_request (main_hbox, 310, 320);
+  gtk_window_resize(GTK_WINDOW(main_window), 310, 640);
+
+  vbox1 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox1, "vbox1");
+  gtk_widget_show (vbox1);
+  gtk_box_pack_start (GTK_BOX (main_hbox), vbox1, TRUE, TRUE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox1), 3);
+
+  hbox1 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_set_name (hbox1, "hbox1");
+  gtk_widget_show (hbox1);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
+
+  frame2 = gtk_frame_new (NULL);
+  gtk_widget_set_name (frame2, "frame2");
+  gtk_widget_show (frame2);
+  gtk_box_pack_start (GTK_BOX (hbox1), frame2, TRUE, TRUE, 0);
+  gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_NONE);
+
+  alignment3 = gtk_alignment_new (0.5, 0.5, 1, 1);
+  gtk_widget_set_name (alignment3, "alignment3");
+  gtk_widget_show (alignment3);
+  gtk_container_add (GTK_CONTAINER (frame2), alignment3);
+  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment3), 0, 0, 12, 0);
+
+  scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_set_name (scrolledwindow3, "scrolledwindow3");
+  gtk_widget_show (scrolledwindow3);
+  gtk_container_add (GTK_CONTAINER (alignment3), scrolledwindow3);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_SHADOW_IN);
+
+  main_themelist = gtk_tree_view_new ();
+  gtk_widget_set_name (main_themelist, "main_themelist");
+  gtk_widget_show (main_themelist);
+  gtk_container_add (GTK_CONTAINER (scrolledwindow3), main_themelist);
+  GTK_WIDGET_SET_FLAGS (main_themelist, GTK_CAN_DEFAULT);
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (main_themelist), FALSE);
+
+  label1234 = gtk_label_new ("<b>Theme</b>");
+  gtk_widget_set_name (label1234, "label1234");
+  gtk_widget_show (label1234);
+  gtk_frame_set_label_widget (GTK_FRAME (frame2), label1234);
+  gtk_label_set_use_markup (GTK_LABEL (label1234), TRUE);
+
+  frame3 = gtk_frame_new (NULL);
+  gtk_widget_set_name (frame3, "frame3");
+  gtk_widget_show (frame3);
+  gtk_box_pack_start (GTK_BOX (vbox1), frame3, FALSE, FALSE, 9);
+  gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_NONE);
+
+  alignment4 = gtk_alignment_new (0.5, 0.5, 1, 1);
+  gtk_widget_set_name (alignment4, "alignment4");
+  gtk_widget_show (alignment4);
+  gtk_container_add (GTK_CONTAINER (frame3), alignment4);
+  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment4), 0, 0, 12, 0);
+
+  vbox7 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox7, "vbox7");
+  gtk_widget_show (vbox7);
+  gtk_container_add (GTK_CONTAINER (alignment4), vbox7);
+
+  hbox8 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_set_name (hbox8, "hbox8");
+  gtk_widget_show (hbox8);
+  gtk_box_pack_start (GTK_BOX (vbox7), hbox8, FALSE, FALSE, 0);
+
+  vbox9 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox9, "vbox9");
+  gtk_widget_show (vbox9);
+  gtk_box_pack_start (GTK_BOX (hbox8), vbox9, TRUE, TRUE, 0);
+
+  main_use_default_font_radio = gtk_radio_button_new_with_mnemonic (NULL, "Use theme default font");
+  gtk_widget_set_name (main_use_default_font_radio, "main_use_default_font_radio");
+  gtk_widget_show (main_use_default_font_radio);
+  gtk_box_pack_start (GTK_BOX (vbox9), main_use_default_font_radio, FALSE, FALSE, 0);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (main_use_default_font_radio), main_use_default_font_radio_group);
+  main_use_default_font_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (main_use_default_font_radio));
+
+  main_use_custom_font_radio = gtk_radio_button_new_with_mnemonic (NULL, "Use custom font:");
+  gtk_widget_set_name (main_use_custom_font_radio, "main_use_custom_font_radio");
+  gtk_widget_show (main_use_custom_font_radio);
+  gtk_box_pack_start (GTK_BOX (vbox9), main_use_custom_font_radio, FALSE, FALSE, 0);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (main_use_custom_font_radio), main_use_default_font_radio_group);
+  main_use_default_font_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (main_use_custom_font_radio));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (main_use_custom_font_radio), TRUE);
+  //gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (main_use_custom_font_radio), FALSE);
+
+  alignment5 = gtk_alignment_new (0.5, 0.5, 1, 1);
+  gtk_widget_set_name (alignment5, "alignment5");
+  gtk_widget_show (alignment5);
+  gtk_box_pack_start (GTK_BOX (vbox9), alignment5, TRUE, TRUE, 0);
+  gtk_alignment_set_padding (GTK_ALIGNMENT (alignment5), 0, 0, 12, 0);
+
+  vbox10 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox10, "vbox10");
+  gtk_widget_show (vbox10);
+  gtk_container_add (GTK_CONTAINER (alignment5), vbox10);
+
+  hbox9 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_set_name (hbox9, "hbox9");
+  gtk_widget_show (hbox9);
+  gtk_box_pack_start (GTK_BOX (vbox10), hbox9, FALSE, FALSE, 0);
+
+  vbox11 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox11, "vbox11");
+  gtk_widget_show (vbox11);
+  gtk_box_pack_start (GTK_BOX (hbox9), vbox11, TRUE, TRUE, 0);
+
+  main_font_selector_button = gtk_font_button_new ();
+  gtk_widget_set_name (main_font_selector_button, "main_font_selector_button");
+  gtk_widget_show (main_font_selector_button);
+  gtk_box_pack_start (GTK_BOX (vbox11), main_font_selector_button, FALSE, FALSE, 0);
+
+  label669 = gtk_label_new ("<b>Font</b>");
+  gtk_widget_set_name (label669, "label669");
+  gtk_widget_show (label669);
+  gtk_frame_set_label_widget (GTK_FRAME (frame3), label669);
+  gtk_label_set_use_markup (GTK_LABEL (label669), TRUE);
+
+  vbox13 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox13, "vbox13");
+  gtk_widget_show (vbox13);
+  gtk_box_pack_start (GTK_BOX (vbox1), vbox13, FALSE, FALSE, 0);
+
+  hbuttonbox1 = gtk_hbutton_box_new ();
+  gtk_widget_set_name (hbuttonbox1, "hbuttonbox1");
+  gtk_widget_show (hbuttonbox1);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox1, FALSE, FALSE, 0);
+
+  hbox7 = gtk_hbox_new (FALSE, 0);
+  gtk_widget_set_name (hbox7, "hbox7");
+  gtk_widget_show (hbox7);
+  gtk_box_pack_start (GTK_BOX (vbox1), hbox7, FALSE, TRUE, 6);
+
+  vbox6 = gtk_vbox_new (FALSE, 0);
+  gtk_widget_set_name (vbox6, "vbox6");
+  gtk_widget_show (vbox6);
+  gtk_box_pack_start (GTK_BOX (vbox1), vbox6, FALSE, FALSE, 0);
+
+  hbox5 = gtk_hbox_new (TRUE, 0);
+  gtk_widget_set_name (hbox5, "hbox5");
+  gtk_widget_show (hbox5);
+  gtk_box_pack_start (GTK_BOX (vbox6), hbox5, FALSE, FALSE, 0);
+  gtk_container_set_border_width (GTK_CONTAINER (hbox5), 4);
+
+  main_ok_button = gtk_button_new_from_stock ("gtk-ok");
+  gtk_widget_set_name (main_ok_button, "main_ok_button");
+  gtk_widget_show (main_ok_button);
+  gtk_box_pack_end (GTK_BOX (hbox5), main_ok_button, TRUE, TRUE, 4);
+  GTK_WIDGET_SET_FLAGS (main_ok_button, GTK_CAN_DEFAULT);
+
+  main_cancel_button = gtk_button_new_from_stock ("gtk-cancel");
+  gtk_widget_set_name (main_cancel_button, "main_cancel_button");
+  gtk_widget_show (main_cancel_button);
+  gtk_box_pack_end (GTK_BOX (hbox5), main_cancel_button, TRUE, TRUE, 4);
+  GTK_WIDGET_SET_FLAGS (main_cancel_button, GTK_CAN_DEFAULT);
+
+  main_reset_button = gtk_button_new ();
+  gtk_widget_set_name (main_reset_button, "main_reset_button");
+  gtk_widget_show (main_reset_button);
+  gtk_box_pack_end (GTK_BOX (hbox5), main_reset_button, TRUE, TRUE, 4);
+
+  alignment2 = gtk_alignment_new (0.5, 0.5, 0, 0);
+  gtk_widget_set_name (alignment2, "alignment2");
+  gtk_widget_show (alignment2);
+  gtk_container_add (GTK_CONTAINER (main_reset_button), alignment2);
+
+  hbox6 = gtk_hbox_new (FALSE, 2);
+  gtk_widget_set_name (hbox6, "hbox6");
+  gtk_widget_show (hbox6);
+  gtk_container_add (GTK_CONTAINER (alignment2), hbox6);
+
+  image1 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_BUTTON);
+  gtk_widget_set_name (image1, "image1");
+  gtk_widget_show (image1);
+  gtk_box_pack_start (GTK_BOX (hbox6), image1, FALSE, FALSE, 0);
+
+  label667 = gtk_label_new_with_mnemonic ("_Reset");
+  gtk_widget_set_name (label667, "label667");
+  gtk_widget_show (label667);
+  gtk_box_pack_start (GTK_BOX (hbox6), label667, FALSE, FALSE, 0);
+
+
+  g_signal_connect ((gpointer) main_window, "delete_event",
+                    G_CALLBACK (on_main_window_delete_event),
+                    NULL);
+  g_signal_connect ((gpointer) main_use_default_font_radio, "toggled",
+                    G_CALLBACK (on_main_use_default_font_radio_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) main_font_selector_button, "font_set",
+                    G_CALLBACK (on_main_font_selector_button_font_set),
+                    NULL);
+  g_signal_connect ((gpointer) main_cancel_button, "clicked",
+                    G_CALLBACK (on_main_cancel_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) main_reset_button, "clicked",
+                    G_CALLBACK (on_main_reset_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) main_ok_button, "clicked",
+                    G_CALLBACK (on_main_ok_button_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (main_window, main_window, "main_window");
+  GLADE_HOOKUP_OBJECT (main_window, main_hbox, "main_hbox");
+  GLADE_HOOKUP_OBJECT (main_window, vbox1, "vbox1");
+  GLADE_HOOKUP_OBJECT (main_window, hbox1, "hbox1");
+  GLADE_HOOKUP_OBJECT (main_window, frame2, "frame2");
+  GLADE_HOOKUP_OBJECT (main_window, alignment3, "alignment3");
+  GLADE_HOOKUP_OBJECT (main_window, scrolledwindow3, "scrolledwindow3");
+  GLADE_HOOKUP_OBJECT (main_window, main_themelist, "main_themelist");
+  GLADE_HOOKUP_OBJECT (main_window, label1234, "label1234");
+  GLADE_HOOKUP_OBJECT (main_window, frame3, "frame3");
+  GLADE_HOOKUP_OBJECT (main_window, alignment4, "alignment4");
+  GLADE_HOOKUP_OBJECT (main_window, vbox7, "vbox7");
+  GLADE_HOOKUP_OBJECT (main_window, hbox8, "hbox8");
+  GLADE_HOOKUP_OBJECT (main_window, vbox9, "vbox9");
+  GLADE_HOOKUP_OBJECT (main_window, main_use_default_font_radio, "main_use_default_font_radio");
+  GLADE_HOOKUP_OBJECT (main_window, main_use_custom_font_radio, "main_use_custom_font_radio");
+  GLADE_HOOKUP_OBJECT (main_window, alignment5, "alignment5");
+  GLADE_HOOKUP_OBJECT (main_window, vbox10, "vbox10");
+  GLADE_HOOKUP_OBJECT (main_window, hbox9, "hbox9");
+  GLADE_HOOKUP_OBJECT (main_window, vbox11, "vbox11");
+  GLADE_HOOKUP_OBJECT (main_window, main_font_selector_button, "main_font_selector_button");
+  GLADE_HOOKUP_OBJECT (main_window, label669, "label669");
+  GLADE_HOOKUP_OBJECT (main_window, vbox13, "vbox13");
+  GLADE_HOOKUP_OBJECT (main_window, hbuttonbox1, "hbuttonbox1");
+  GLADE_HOOKUP_OBJECT (main_window, hbox7, "hbox7");
+  GLADE_HOOKUP_OBJECT (main_window, vbox6, "vbox6");
+  GLADE_HOOKUP_OBJECT (main_window, hbox5, "hbox5");
+  GLADE_HOOKUP_OBJECT (main_window, main_ok_button, "main_ok_button");
+  GLADE_HOOKUP_OBJECT (main_window, main_cancel_button, "main_cancel_button");
+  GLADE_HOOKUP_OBJECT (main_window, main_reset_button, "main_reset_button");
+  GLADE_HOOKUP_OBJECT (main_window, alignment2, "alignment2");
+  GLADE_HOOKUP_OBJECT (main_window, hbox6, "hbox6");
+  GLADE_HOOKUP_OBJECT (main_window, image1, "image1");
+  GLADE_HOOKUP_OBJECT (main_window, label667, "label667");
+
+  GLADE_HOOKUP_OBJECT_NO_REF (main_window, tooltips, "tooltips");
+
+  gtk_widget_grab_default (main_themelist);
+  gtk_window_add_accel_group (GTK_WINDOW (main_window), accel_group);
+
+  return main_window;
+}
+
+
+
+
+static std::string gchar_to_string(gchar* gstr)
+{
+       std::string str = (gstr ? gstr : "");
+       g_free(gstr);
+       return str;
+}
+
+
+
+// ------------------------------------------------------
+
+
+static std::string s_orig_theme;
+static std::string s_orig_font;
+
+std::string& get_orig_theme()
+{
+       return s_orig_theme;
+}
+
+
+std::string& get_orig_font()
+{
+       return s_orig_font;
+}
+
+
+// ------------------------------------------------------
+
+
+std::string get_current_theme()
+{
+
+       GtkSettings* settings = gtk_settings_get_default();
+       gchar* theme;
+       g_object_get(settings, "gtk-theme-name", &theme, NULL);
+
+       /* dummy check */
+       if( !g_ascii_isalnum( theme[0] ) ){
+               g_free( theme );
+               return "";
+       }
+       return gchar_to_string(theme);
+}
+
+
+
+
+std::string get_current_font()
+{
+       return gchar_to_string( pango_font_description_to_string( gtk_rc_get_style( g_main_rc_window )->font_desc ) );
+}
+
+
+
+// ------------------------------------------------------
+
+
+
+std::string get_selected_theme()
+{
+       GtkTreeView* treeview = GTK_TREE_VIEW(lookup_widget(g_main_rc_window, "main_themelist"));
+       GtkTreeModel* model = gtk_tree_view_get_model(treeview);
+       GtkTreeSelection* selection = gtk_tree_view_get_selection(treeview);
+
+       GtkTreeIter iter;
+       gtk_tree_selection_get_selected(selection, 0, &iter);
+
+       gchar* theme_name;
+       gtk_tree_model_get(model, &iter, 0, &theme_name, -1);
+//     std::cout << theme_name << "\n";
+       return gchar_to_string(theme_name);
+}
+
+
+
+std::string get_selected_font()
+{
+//     GtkWidget* fontentry = lookup_widget(g_main_rc_window, "main_fontentry");
+//     return gtk_entry_get_text(GTK_ENTRY(fontentry));
+
+       bool default_font = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(g_main_rc_window, "main_use_default_font_radio")));
+
+       if (default_font)
+               return "";
+
+       GtkWidget* fontbutton = lookup_widget(g_main_rc_window, "main_font_selector_button");
+       return gtk_font_button_get_font_name(GTK_FONT_BUTTON(fontbutton));
+}
+
+
+// ------------------------------------------------------
+
+
+
+static void themelist_selection_changed_cb(GtkTreeSelection* selection, gpointer data)
+{
+       if (gtk_tree_selection_get_selected (selection, 0, 0))
+               apply_theme(get_selected_theme(), get_current_font());
+}
+
+
+
+// ------------------------------------------------------
+
+
+
+static void populate_with_themes(GtkWidget* w)
+{
+
+       std::string search_path = gchar_to_string(gtk_rc_get_theme_dir());
+
+       if (search_path.size() && search_path[search_path.size() -1] != G_DIR_SEPARATOR)
+               search_path += G_DIR_SEPARATOR_S;
+
+       GDir* gdir = g_dir_open(search_path.c_str(), 0, NULL);
+       if (gdir == NULL)
+               return;
+
+
+       char* name;
+       GList* glist = 0;
+
+       while ( (name = const_cast<char*>(g_dir_read_name(gdir))) != NULL ) {
+               std::string filename = name;
+
+//             if (g_ascii_strup(fname.c_str(), -1) == "Default")
+//                     continue;
+
+               std::string fullname = search_path + filename;
+               std::string rc = fullname; rc += G_DIR_SEPARATOR_S; rc += "gtk-2.0"; rc += G_DIR_SEPARATOR_S; rc += "gtkrc";
+
+               bool is_dir = 0;
+               if (g_file_test(fullname.c_str(), G_FILE_TEST_IS_DIR))
+                       is_dir = 1;
+
+               if (is_dir && g_file_test(rc.c_str(), G_FILE_TEST_IS_REGULAR)) {
+                       glist = g_list_insert_sorted(glist, g_strdup(filename.c_str()), (GCompareFunc)strcmp);
+               }
+       }
+
+       g_dir_close(gdir);
+
+
+
+
+       // ---------------- tree
+
+
+       GtkTreeView* treeview = GTK_TREE_VIEW(w);
+       GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
+       gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(store));
+
+       GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes (
+                                                                                               "Theme", gtk_cell_renderer_text_new(),
+                                                                                               "text", 0,
+                                                                                               NULL);
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+       gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+
+
+       GtkTreeIter   iter;
+
+       int i =0, curr=0;
+       while (char* theme = (char*)g_list_nth_data(glist, i)) {
+               gtk_list_store_append (store, &iter);
+               gtk_list_store_set (store, &iter, 0, theme, -1);
+
+               if (strcmp(theme, get_current_theme().c_str()) == 0) {
+                       curr = i;
+               }
+
+               ++i;
+       }
+
+
+       GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+
+       // set the default theme
+
+       // THIS IS IMPORTANT!!!
+       gtk_widget_grab_focus(w);
+
+       std::stringstream str;
+       str << curr;
+       GtkTreePath* selpath = gtk_tree_path_new_from_string (str.str().c_str());
+       if (selpath) {
+               gtk_tree_selection_select_path(selection, selpath);
+               gtk_tree_view_scroll_to_cell(treeview, selpath, NULL, true, 0.5, 0.0);
+               gtk_tree_path_free(selpath);
+       }
+
+       g_signal_connect (G_OBJECT (selection), "changed",
+                  G_CALLBACK (themelist_selection_changed_cb), NULL);
+
+       g_object_unref (G_OBJECT (store));
+
+
+       // ---------------- font
+
+
+       GtkWidget* fontbutton = lookup_widget(g_main_rc_window, "main_font_selector_button");
+       gtk_font_button_set_font_name(GTK_FONT_BUTTON(fontbutton), get_current_font().c_str());
+
+
+}
+
+
+
+
+// ------------------------------------------------------
+
+
+
+
+void gtkThemeDlg(){
+       if( g_main_rc_window ) return;
+
+       s_rc_file = std::string( AppPath_get() ) + G_DIR_SEPARATOR_S + ".gtkrc-2.0.radiant";
+
+       g_main_rc_window = create_rc_window();
+
+    populate_with_themes( lookup_widget( g_main_rc_window, "main_themelist" ) );
+
+       get_orig_theme() = get_current_theme();
+       get_orig_font() = get_current_font();
+
+       gtk_widget_show ( g_main_rc_window );
+}
+
+
+
+// -------------------------------
+
+
+
+void set_theme(const std::string& theme_name, const std::string& font)
+{
+       if( theme_name.empty() ) return;
+
+       // tree
+       GtkTreeView* treeview = GTK_TREE_VIEW(lookup_widget(g_main_rc_window, "main_themelist"));
+       GtkTreeModel* model = gtk_tree_view_get_model(treeview);
+       GtkTreeSelection* selection = gtk_tree_view_get_selection(treeview);
+
+       GtkTreeIter iter;
+       gtk_tree_model_get_iter_first(model, &iter);
+
+       while(gtk_tree_model_iter_next(model, &iter)) {
+
+               gchar* text;
+               gtk_tree_model_get (model, &iter, 0, &text, -1);
+               std::string theme = gchar_to_string(text);
+
+               if (theme_name == theme) {
+                       gtk_tree_selection_select_iter(selection, &iter);
+                       break;
+               }
+
+       }
+
+
+       // font
+       if (font != "") {
+               GtkWidget* fontbutton = lookup_widget(g_main_rc_window, "main_font_selector_button");
+               //gtk_font_button_set_font_name(GTK_FONT_BUTTON(fontbutton), get_current_font().c_str());
+               gtk_font_button_set_font_name(GTK_FONT_BUTTON(fontbutton), font.c_str());
+       }
+
+
+       apply_theme(get_selected_theme(), get_selected_font());
+
+}
+
+
+
+
+void apply_theme(const std::string& theme_name, const std::string& font)
+{
+
+       std::stringstream strstr;
+       strstr << "gtk-theme-name = \"" << theme_name << "\"\n";
+
+       if (font != "")
+               strstr << "style \"user-font\"\n{\nfont_name=\"" << font << "\"\n}\nwidget_class \"*\" style \"user-font\"";
+
+       //strstr << "\ngtk-menu-popup-delay = 10";
+
+//     std::cout << strstr.str() << "\n\n\n";
+       std::fstream f;
+       f.open(s_rc_file.c_str(), std::ios::out);
+               f << strstr.str();
+       f.close();
+
+
+       GtkSettings* settings = gtk_settings_get_default();
+
+       gtk_rc_reparse_all_for_settings (settings, true);
+//     gtk_rc_parse_string(strstr.str().c_str());
+//     gtk_rc_parse("/root/.gtk-tmp");
+//     gtk_rc_reset_styles(settings);
+
+       //unlink(s_rc_file.c_str());
+
+       while (gtk_events_pending())
+               gtk_main_iteration();
+
+
+}
+
+#endif // GARUX_DISABLE_GTKTHEME
diff --git a/radiant/gtktheme.h b/radiant/gtktheme.h
new file mode 100644 (file)
index 0000000..9aa723d
--- /dev/null
@@ -0,0 +1,19 @@
+/***************************************************************************
+                          main.cpp  -  description
+                             -------------------
+    begin                : Wed Jan  1 2003
+    copyright            : (C) 2003 - 2005 by Alex Shaduri
+    email                : ashaduri '@' gmail.com
+ ***************************************************************************/
+
+#define GARUX_DISABLE_GTKTHEME
+#ifndef GARUX_DISABLE_GTKTHEME
+
+#ifndef _GTKTHEME_H_
+#define _GTKTHEME_H_
+
+void gtkThemeDlg();
+
+#endif
+
+#endif // GARUX_DISABLE_GTKTHEME
index 8564fc7b62036596cee9ecbe4bb108d44953f26f..a2d288f15eff91315e794a5a14f8ed1419ce370a 100644 (file)
@@ -502,6 +502,31 @@ void user_shortcuts_save(){
        SaveCommandMap( path.c_str() );
 }
 
+void add_local_rc_files(){
+#define GARUX_DISABLE_GTKTHEME
+#ifndef GARUX_DISABLE_GTKTHEME
+/* FIXME: HACK: not GTK3 compatible
+ https://developer.gnome.org/gtk2/stable/gtk2-Resource-Files.html#gtk-rc-add-default-file
+ https://developer.gnome.org/gtk3/stable/gtk3-Resource-Files.html#gtk-rc-add-default-file
+ > gtk_rc_add_default_file has been deprecated since version 3.0 and should not be used in newly-written code.
+ > Use GtkStyleContext with a custom GtkStyleProvider instead
+*/
+
+       {
+               StringOutputStream path( 512 );
+               path << AppPath_get() << ".gtkrc-2.0.radiant";
+               gtk_rc_add_default_file( path.c_str() );
+       }
+#ifdef WIN32
+       {
+               StringOutputStream path( 512 );
+               path << AppPath_get() << ".gtkrc-2.0.win";
+               gtk_rc_add_default_file( path.c_str() );
+       }
+#endif
+#endif // GARUX_DISABLE_GTKTHEME
+}
+
 /* HACK: If ui::main is not called yet,
 gtk_main_quit will not quit, so tell main
 to not call ui::main. This happens when a
@@ -561,9 +586,9 @@ int main( int argc, char* argv[] ){
        }
 
        // Gtk already removed parsed `--options`
-       if ( argc == 2 ) {
-               if ( strlen( argv[ 1 ] ) > 1 ) {
-                       mapname = argv[ 1 ];
+       if (argc == 2) {
+               if ( strlen( argv[1] ) > 1 ) {
+                                       mapname = argv[1];
 
                        if ( g_str_has_suffix( mapname, ".map" ) ) {
                                if ( !g_path_is_absolute( mapname ) ) {
@@ -581,7 +606,7 @@ int main( int argc, char* argv[] ){
                        }
                }
        }
-       else if ( argc > 2 ) {
+       else if (argc > 2) {
                g_print ( "%s\n", "too many arguments" );
                return -1;
        }
@@ -604,6 +629,8 @@ int main( int argc, char* argv[] ){
 
        paths_init();
 
+       add_local_rc_files();
+
        show_splash();
 
        create_global_pid();
@@ -672,7 +699,7 @@ int main( int argc, char* argv[] ){
        restart to load another format is merged. */
        if ( !g_dontStart )
        {
-               ui::main();
+       ui::main();
        }
 
        // avoid saving prefs when the app is minimized
index c413708181aa6dc9a0306064202a9827619b01cb..8cc59bc18576ae7b622b6c77c5666f5b6cd187d1 100644 (file)
 #define WORKAROUND_GOBJECT_SET_GLWIDGET(window, widget)
 #endif
 
+#define GARUX_DISABLE_GTKTHEME
+#ifndef GARUX_DISABLE_GTKTHEME
+#include "gtktheme.h"
+#endif
+
 struct layout_globals_t
 {
        WindowPosition m_position;
@@ -1137,6 +1142,10 @@ ui::MenuItem create_colours_menu(){
        create_menu_item_with_mnemonic( menu_3, "Maya/Max/Lightwave Emulation", "ColorSchemeYdnar" );
        create_menu_item_with_mnemonic(menu_3, "Adwaita Dark", "ColorSchemeAdwaitaDark");
 
+#ifndef GARUX_DISABLE_GTKTHEME
+       create_menu_item_with_mnemonic( menu_in_menu, "GTK Theme...", "gtkThemeDlg" );
+#endif
+
        menu_separator( menu_in_menu );
 
        create_menu_item_with_mnemonic( menu_in_menu, "_Texture Background...", "ChooseTextureBackgroundColor" );
@@ -3590,6 +3599,9 @@ void MainFrame_Construct(){
        GlobalToggles_insert( "MouseScale", makeCallbackF(ScaleMode), ToggleItem::AddCallbackCaller( g_scalemode_button ) );
        GlobalToggles_insert( "MouseDrag", makeCallbackF(DragMode), ToggleItem::AddCallbackCaller( g_dragmode_button ), Accelerator( 'Q' ) );
 
+#ifndef GARUX_DISABLE_GTKTHEME
+       GlobalCommands_insert( "gtkThemeDlg", makeCallbackF(gtkThemeDlg) );
+#endif
        GlobalCommands_insert( "ColorSchemeOriginal", makeCallbackF(ColorScheme_Original) );
        GlobalCommands_insert( "ColorSchemeQER", makeCallbackF(ColorScheme_QER) );
        GlobalCommands_insert( "ColorSchemeBlackAndGreen", makeCallbackF(ColorScheme_Black) );
index 32c4a8137b11db24039989795297b717b2326f8d..f1cc83f5bee9abd7a5429a6dc0c77e33eccdf0ff 100644 (file)
@@ -2302,6 +2302,7 @@ ui::Widget TextureBrowser_constructWindow( ui::Window toplevel ){
                auto menu_view = ui::Menu(ui::New);
                // auto view_item = TextureBrowser_constructViewMenu( menu_view );
                TextureBrowser_constructViewMenu( menu_view );
+               gtk_menu_set_title( menu_view, "View" );
                // gtk_menu_item_set_submenu( GTK_MENU_ITEM( view_item ), menu_view );
                // gtk_menu_shell_append( GTK_MENU_SHELL( menu_bar ), view_item );
 
@@ -2313,6 +2314,9 @@ ui::Widget TextureBrowser_constructWindow( ui::Window toplevel ){
                        auto button = toolbar_append_button( toolbar, "View", "texbro_view.png" );
                        button.dimensions( 22, 22 );
                        button.connect( "clicked", G_CALLBACK( Popup_View_Menu ), menu_view );
+
+                       //to show detached menu over floating tex bro
+                       gtk_menu_attach_to_widget( GTK_MENU( menu_view ), GTK_WIDGET( button ), NULL );
                }
                {
                        auto button = toolbar_append_button( toolbar, "Find / Replace...", "texbro_gtk-find-and-replace.png", "FindReplaceTextures" );
index 5e67ecf2813394ebc4c881e16c647b3636fcc633..3470f861b0834c25f984a62caf646eb0461cea7c 100644 (file)
@@ -739,7 +739,16 @@ Shader* XYWnd::m_state_selected = 0;
 
 void xy_update_xor_rectangle( XYWnd& self, rect_t area ){
        if ( self.GetWidget().visible() ) {
-               self.m_XORRectangle.set( rectangle_from_area( area.min, area.max, self.Width(), self.Height() ) );
+               rectangle_t rect = rectangle_from_area( area.min, area.max, self.Width(), self.Height() );
+               int nDim1 = ( self.GetViewType() == YZ ) ? 1 : 0;
+               int nDim2 = ( self.GetViewType() == XY ) ? 1 : 2;
+               rect.x /= self.Scale();
+               rect.y /= self.Scale();
+               rect.w /= self.Scale();
+               rect.h /= self.Scale();
+               rect.x += self.GetOrigin()[nDim1];
+               rect.y += self.GetOrigin()[nDim2];
+               self.m_XORRectangle.set( rect );
        }
 }