tInitial support for gtk_url widget under Win32 - vaccinewars - be a doctor and try to vaccinate the world
(HTM) git clone git://src.adamsgaard.dk/vaccinewars
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 095a7a16ee6b0b709e0cbb2425b7e70af93e465e
(DIR) parent 59957ad5d66dac73994dc02342928a4562049126
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Thu, 14 Feb 2002 16:58:20 +0000
Initial support for gtk_url widget under Win32
Diffstat:
M src/gtkport.c | 97 ++++++++++++++++++++++++++++++-
M src/gtkport.h | 9 +++++++++
2 files changed, 105 insertions(+), 1 deletion(-)
---
(DIR) diff --git a/src/gtkport.c b/src/gtkport.c
t@@ -51,6 +51,7 @@ static const gchar *WC_GTKSEP = "WC_GTKSEP";
static const gchar *WC_GTKVPANED = "WC_GTKVPANED";
static const gchar *WC_GTKHPANED = "WC_GTKHPANED";
static const gchar *WC_GTKDIALOG = "WC_GTKDIALOG";
+static const gchar *WC_GTKURL = "WC_GTKURL";
static BOOL GetTextSize(HWND hWnd,char *text,LPSIZE lpSize);
static void gtk_button_size_request(GtkWidget *widget,
t@@ -112,7 +113,9 @@ static void gtk_label_size_request(GtkWidget *widget,
static void gtk_label_set_size(GtkWidget *widget,
GtkAllocation *allocation);
static void gtk_label_destroy(GtkWidget *widget);
+static void gtk_url_destroy(GtkWidget *widget);
static void gtk_label_realize(GtkWidget *widget);
+static void gtk_url_realize(GtkWidget *widget);
static void gtk_frame_size_request(GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_frame_set_size(GtkWidget *widget,GtkAllocation *allocation);
t@@ -411,6 +414,18 @@ static GtkClass GtkLabelClass = {
"label",&GtkWidgetClass,sizeof(GtkLabel),GtkLabelSignals
};
+static GtkSignalType GtkUrlSignals[] = {
+ { "size_request",gtk_marshal_VOID__GPOIN,gtk_label_size_request },
+ { "set_size",gtk_marshal_VOID__GPOIN,gtk_label_set_size },
+ { "realize",gtk_marshal_VOID__VOID,gtk_url_realize },
+ { "destroy",gtk_marshal_VOID__VOID,gtk_url_destroy },
+ { "", NULL, NULL }
+};
+
+static GtkClass GtkUrlClass = {
+ "URL", &GtkLabelClass, sizeof(GtkUrl), GtkUrlSignals
+};
+
static GtkSignalType GtkButtonSignals[] = {
{ "size_request",gtk_marshal_VOID__GPOIN,gtk_button_size_request },
{ "set_text",gtk_marshal_VOID__GPOIN,gtk_button_set_text },
t@@ -619,7 +634,7 @@ const GtkType GTK_TYPE_WINDOW=&GtkWindowClass;
const GtkType GTK_TYPE_MENU_BAR=&GtkMenuBarClass;
static HINSTANCE hInst;
-static HFONT hFont;
+static HFONT hFont, urlFont;
static GSList *WindowList=NULL;
static GSList *GdkInputs=NULL;
static GSList *GtkTimeouts=NULL;
t@@ -787,6 +802,42 @@ LRESULT CALLBACK GtkPanedProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) {
return FALSE;
}
+LRESULT CALLBACK GtkUrlProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) {
+ GtkWidget *widget;
+
+ if (msg == WM_PAINT) {
+ gchar *text;
+ RECT wndrect;
+ PAINTSTRUCT ps;
+ HDC hDC;
+ HFONT oldFont;
+
+ widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA));
+ text = GTK_LABEL(widget)->text;
+ if (text && BeginPaint(hwnd, &ps)) {
+ hDC = ps.hdc;
+ oldFont = SelectObject(hDC, urlFont);
+ SetTextColor(hDC, RGB(0, 0, 0xCC));
+ SetBkMode(hDC, TRANSPARENT);
+ GetClientRect(hwnd, &wndrect);
+ DrawText(hDC, text, -1, &wndrect,
+ DT_CENTER | DT_VCENTER | DT_END_ELLIPSIS);
+ SelectObject(hDC, oldFont);
+ EndPaint(hwnd, &ps);
+ }
+ return TRUE;
+ } else if (msg == WM_LBUTTONUP) {
+ gchar *target;
+
+ widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA));
+ target = GTK_URL(widget)->target;
+
+ ShellExecute(hwnd, "open", target, NULL, NULL, 0);
+// MessageBox(NULL, "URL triggered", NULL, MB_OK);
+ return FALSE;
+ } else return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
LRESULT CALLBACK GtkSepProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) {
PAINTSTRUCT ps;
HPEN oldpen,dkpen,ltpen;
t@@ -986,8 +1037,12 @@ void SetCustomWndProc(WNDPROC wndproc) {
void win32_init(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *MainIcon) {
WNDCLASS wc;
+
hInst=hInstance;
hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
+ urlFont = CreateFont(14, 0, 0, 0, FW_SEMIBOLD, FALSE, TRUE, FALSE,
+ ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
+ DEFAULT_QUALITY, FF_SWISS | DEFAULT_PITCH, NULL);
WindowList=NULL;
RecurseLevel=0;
customWndProc = NULL;
t@@ -1056,6 +1111,18 @@ void win32_init(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *MainIcon) {
wc.lpszMenuName = NULL;
wc.lpszClassName = WC_GTKSEP;
RegisterClass(&wc);
+
+ wc.style = CS_HREDRAW|CS_VREDRAW;
+ wc.lpfnWndProc = GtkUrlProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hInstance;
+ wc.hIcon = NULL;
+ wc.hCursor = LoadCursor(NULL,IDC_HAND);
+ wc.hbrBackground = (HBRUSH)(1+COLOR_BTNFACE);
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = WC_GTKURL;
+ RegisterClass(&wc);
}
InitCommonControls();
t@@ -1567,6 +1634,18 @@ GtkWidget *gtk_label_new(const gchar *text) {
return GTK_WIDGET(label);
}
+GtkWidget *gtk_url_new(const gchar *text, const gchar *target)
+{
+ GtkUrl *url;
+
+ url = GTK_URL(GtkNewObject(&GtkUrlClass));
+
+ GTK_LABEL(url)->text = g_strdup(text);
+ url->target = g_strdup(target);
+
+ return GTK_WIDGET(url);
+}
+
GtkWidget *gtk_hbox_new(gboolean homogeneous,gint spacing) {
GtkBox *hbox;
t@@ -2645,6 +2724,12 @@ void gtk_label_destroy(GtkWidget *widget) {
g_free(GTK_LABEL(widget)->text);
}
+void gtk_url_destroy(GtkWidget *widget)
+{
+ g_free(GTK_LABEL(widget)->text);
+ g_free(GTK_URL(widget)->target);
+}
+
void gtk_label_realize(GtkWidget *widget) {
GtkLabel *label=GTK_LABEL(widget);
HWND Parent;
t@@ -2657,6 +2742,16 @@ void gtk_label_realize(GtkWidget *widget) {
gtk_set_default_font(widget->hWnd);
}
+void gtk_url_realize(GtkWidget *widget) {
+ HWND Parent;
+ Parent=gtk_get_parent_hwnd(widget);
+ widget->hWnd = CreateWindow(WC_GTKURL,GTK_LABEL(widget)->text,
+ WS_CHILD,
+ widget->allocation.x,widget->allocation.y,
+ widget->allocation.width,widget->allocation.height,
+ Parent,NULL,hInst,NULL);
+}
+
void gtk_container_add(GtkContainer *container,GtkWidget *widget) {
container->child=widget;
widget->parent=GTK_WIDGET(container);
(DIR) diff --git a/src/gtkport.h b/src/gtkport.h
t@@ -271,6 +271,13 @@ struct _GtkLabel {
gchar *text;
};
+typedef struct _GtkUrl GtkUrl;
+
+struct _GtkUrl {
+ GtkLabel label;
+ gchar *target;
+};
+
typedef struct _GtkContainer GtkContainer;
struct _GtkContainer {
t@@ -503,6 +510,7 @@ struct _GtkTableRowCol {
#define GTK_RADIO_BUTTON(obj) ((GtkRadioButton *)(obj))
#define GTK_CHECK_BUTTON(obj) ((GtkCheckButton *)(obj))
#define GTK_LABEL(obj) ((GtkLabel *)(obj))
+#define GTK_URL(obj) ((GtkUrl *)(obj))
#define GTK_TABLE(obj) ((GtkTable *)(obj))
#define GTK_MENU_SHELL(obj) ((GtkMenuShell *)(obj))
#define GTK_MENU_BAR(obj) ((GtkMenuBar *)(obj))
t@@ -544,6 +552,7 @@ void gtk_container_add(GtkContainer *container,GtkWidget *widget);
void gtk_container_set_border_width(GtkContainer *container,guint border_width);
GtkWidget *gtk_button_new_with_label(const gchar *label);
GtkWidget *gtk_label_new(const gchar *text);
+GtkWidget *gtk_url_new(const gchar *text, const gchar *target);
GtkWidget *gtk_hbox_new(gboolean homogeneous,gint spacing);
GtkWidget *gtk_vbox_new(gboolean homogeneous,gint spacing);
GtkWidget *gtk_check_button_new_with_label(const gchar *label);